Pregunta Encuentra registros duplicados en MySQL


Quiero sacar registros duplicados en una base de datos MySQL. Esto se puede hacer con:

SELECT address, count(id) as cnt FROM list
GROUP BY address HAVING cnt > 1

Lo que resulta en:

100 MAIN ST    2

Me gustaría sacarlo para que muestre cada fila que es un duplicado. Algo como:

JIM    JONES    100 MAIN ST
JOHN   SMITH    100 MAIN ST

¿Alguna idea de cómo se puede hacer esto? Intento evitar hacer el primero y luego buscar los duplicados con una segunda consulta en el código.


579
2018-05-12 18:24


origen


Respuestas:


La clave es reescribir esta consulta para que pueda ser utilizada como una subconsulta.

SELECT firstname, 
   lastname, 
   list.address 
FROM list
   INNER JOIN (SELECT address
               FROM   list
               GROUP  BY address
               HAVING COUNT(id) > 1) dup
           ON list.address = dup.address;

617
2018-05-12 18:33



SELECT date FROM logs group by date having count(*) >= 2

305
2018-03-19 17:57



¿Por qué no solo INNER ÚNASE a la mesa consigo mismo?

SELECT a.firstname, a.lastname, a.address
FROM list a
INNER JOIN list b ON a.address = b.address
WHERE a.id <> b.id

Se necesita DISTINCT si la dirección podría existir más de dos veces.


190
2018-05-12 18:49



Probé la mejor respuesta elegida para esta pregunta, pero me confundió un poco. De hecho, lo necesitaba solo en un solo campo de mi mesa. El siguiente ejemplo de este enlace funcionó muy bien para mí:

SELECT COUNT(*) c,title FROM `data` GROUP BY title HAVING c > 1;

49
2018-01-08 13:45



select `cityname` from `codcities` group by `cityname` having count(*)>=2

Esta es la consulta similar que ha solicitado y su 200% de funcionamiento y fácil también. ¡¡¡Disfrutar!!!


39
2018-06-20 10:34



Buscar usuarios duplicados por dirección de correo electrónico con esta consulta ...

SELECT users.name, users.uid, users.mail, from_unixtime(created)
FROM users
INNER JOIN (
  SELECT mail
  FROM users
  GROUP BY mail
  HAVING count(mail) > 1
) dupes ON users.mail = dupes.mail
ORDER BY users.mail;

34
2018-01-26 00:39



podemos encontrar que los duplicados también dependen de más de un campo. Para esos casos, puede usar el siguiente formato.

SELECT COUNT(*), column1, column2 
FROM tablename
GROUP BY column1, column2
HAVING COUNT(*)>1;

17
2018-03-02 07:04



Otra solución sería usar alias de tabla, así:

SELECT p1.id, p2.id, p1.address
FROM list AS p1, list AS p2
WHERE p1.address = p2.address
AND p1.id != p2.id

Todo lo que realmente estás haciendo en este caso es tomar el original lista mesa, creando dos pagreintentar tablas - pag1 y pag2 - fuera de eso, y luego realizar una unión en la columna de dirección (línea 3). La cuarta línea se asegura de que el mismo registro no aparezca varias veces en su conjunto de resultados ("duplicados duplicados").


12
2018-06-14 04:14



Encontrar duplicado direcciones es mucho más complejo de lo que parece, especialmente si requiere precisión. Una consulta MySQL no es suficiente en este caso ...

trabajo en SmartyStreets, donde abordamos la validación y deduplicación y otras cosas, y he visto muchos desafíos diferentes con problemas similares.

Hay varios servicios de terceros que marcarán duplicados en una lista para usted. Hacer esto únicamente con una subconsulta de MySQL no tendrá en cuenta las diferencias en los formatos de dirección y las normas. El USPS (para dirección de EE. UU.) Tiene ciertas pautas para establecer estos estándares, pero solo un puñado de proveedores están certificados para realizar tales operaciones.

Por lo tanto, recomendaría que la mejor respuesta para usted es exportar la tabla a un archivo CSV, por ejemplo, y enviarla a un procesador de listas capaz. Uno de ellos es LiveAddress que lo hará por usted en unos segundos o unos minutos automáticamente. Marcará filas duplicadas con un nuevo campo llamado "Duplicar" y un valor de Y en eso.


11
2018-01-25 20:00



Esto seleccionará duplicados en un pase de tabla, sin subconsultas.

SELECT  *
FROM    (
        SELECT  ao.*, (@r := @r + 1) AS rn
        FROM    (
                SELECT  @_address := 'N'
                ) vars,
                (
                SELECT  *
                FROM
                        list a
                ORDER BY
                        address, id
                ) ao
        WHERE   CASE WHEN @_address <> address THEN @r := 0 ELSE 0 END IS NOT NULL
                AND (@_address := address ) IS NOT NULL
        ) aoo
WHERE   rn > 1

Esta consulta emula en forma activa ROW_NUMBER() presentar en Oracle y SQL Server

Ver el artículo en mi blog para más detalles:


10
2018-05-12 18:36



No va a ser muy eficiente, pero debería funcionar:

SELECT *
FROM list AS outer
WHERE (SELECT COUNT(*)
        FROM list AS inner
        WHERE inner.address = outer.address) > 1;

8
2018-05-12 18:28