Pregunta

Quiero extraer 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 tirarlo para que muestre cada fila que es un duplicado.Algo como:

JIM    JONES    100 MAIN ST
JOHN   SMITH    100 MAIN ST

¿Alguna idea sobre cómo se puede hacer esto?Estoy tratando de evitar hacer la primera y luego buscar los duplicados con una segunda consulta en el código.

¿Fue útil?

Solución

La clave es volver a escribir esta consulta para que pueda ser utilizado como una sub consulta.

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;

Otros consejos

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

¿Por qué no INNER JOIN la tabla consigo misma?

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

Una clara es necesaria si la dirección podría existir más de dos veces.

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

SELECT COUNT(*) c,title FROM `data` GROUP BY title HAVING c > 1;
select `cityname` from `codcities` group by `cityname` having count(*)>=2

Esta es la consulta similar que has pedido y su 200% de trabajo y también muy fácil. Disfrutar !!!

Para los 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;

No es esto más fácil:

SELECT *
FROM tc_tariff_groups
GROUP BY group_id
HAVING COUNT(group_id) >1

podemos encontrar los duplicados depende en más de una campos also.For esos casos se puede utilizar debajo del formato.

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

Otra solución sería utilizar 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 estamos haciendo en realidad en este caso es tomar el lista original mesa, la creación de dos p mesas retend - p 1 y p 2 - fuera de eso, y luego la realización de una combinación en la columna de la dirección (línea 3). La cuarta línea se asegura de que el mismo registro no aparece varias veces en el conjunto de resultados ( "duplicado duplicados").

Búsqueda de duplicados direcciones es mucho más complejo de lo que parece, sobre todo si se requiere precisión. Una consulta de MySQL no es suficiente en este caso ...

Trabajo en SmartyStreets , donde hacemos la validación de direcciones y de-duplicación y otras cosas, y he visto una gran cantidad de diversos retos con problemas similares.

Hay varios servicios de terceros que será duplicados bandera en una lista para usted. Hacer esto solamente con una sub consulta MySQL no dará cuenta de las diferencias en los formatos y estándares de dirección. El USPS (dirección de los Estados Unidos) ha ciertas pautas para que éstos estándar, pero sólo un puñado de proveedores están certificados para llevar a cabo este tipo de operaciones.

Por lo tanto, recomiendo la mejor respuesta para usted es para exportar la tabla en un archivo CSV, por ejemplo, y enviarlo a un procesador capaz lista. Uno de ellos es LiveAddress la que habrá que hacer para que en unos pocos segundos a unos pocos minutos de forma automática. Será filas duplicadas con la bandera de un nuevo campo llamado "Duplicar" y un valor de Y en ella.

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;

Esto seleccionará duplicados en una sola pasada 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 realmente emula ROW_NUMBER() presentar en Oracle y SQL Server

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

Esto también le mostrará cómo muchos duplicados tienen y ordenará los resultados sin juntas

SELECT  `Language` , id, COUNT( id ) AS how_many
FROM  `languages` 
GROUP BY  `Language` 
HAVING how_many >=2
ORDER BY how_many DESC
 SELECT firstname, lastname, address FROM list
 WHERE 
 Address in 
 (SELECT address FROM list
 GROUP BY address
 HAVING count(*) > 1)
select * from table_name t1 inner join (select distinct <attribute list> from table_name as temp)t2 where t1.attribute_name = t2.attribute_name

En su mesa sería algo así como

select * from list l1 inner join (select distinct address from list as list2)l2 where l1.address=l2.address

Esta consulta le dará todas las entradas de direcciones distintas en su tabla de la lista ... No estoy seguro de cómo va a funcionar si tiene valores de clave principal para el nombre, etc ..

más rápido procedimiento de consultas de eliminación de duplicados:

/* create temp table with one primary column id */
INSERT INTO temp(id) SELECT MIN(id) FROM list GROUP BY (isbn) HAVING COUNT(*)>1;
DELETE FROM list WHERE id IN (SELECT id FROM temp);
DELETE FROM temp;

En lo personal esta consulta ha resuelto mi problema:

SELECT `SUB_ID`, COUNT(SRV_KW_ID) as subscriptions FROM `SUB_SUBSCR` group by SUB_ID, SRV_KW_ID HAVING subscriptions > 1;

Lo que hace este script está mostrando todos los de identificación del suscriptor que existe más de una vez en la mesa y el número de duplicados encontrado.

Estos son las columnas de tabla:

| SUB_SUBSCR_ID | int(11)     | NO   | PRI | NULL    | auto_increment |
| MSI_ALIAS     | varchar(64) | YES  | UNI | NULL    |                |
| SUB_ID        | int(11)     | NO   | MUL | NULL    |                |    
| SRV_KW_ID     | int(11)     | NO   | MUL | NULL    |                |

Esperamos que sea útil para usted, ya sea!

SELECT t.*,(select count(*) from city as tt where tt.name=t.name) as count FROM `city` as t where (select count(*) from city as tt where tt.name=t.name) > 1 order by count desc

Reemplazar ciudad con su tabla. Reemplazar nombre con su nombre de campo

    SELECT *
    FROM (SELECT  address, COUNT(id) AS cnt
    FROM list
    GROUP BY address
    HAVING ( COUNT(id) > 1 ))

Powerlord respuesta es sin duda la mejor y lo recomendaría un cambio más: Límite de uso para asegurarse de que no conseguiría db sobrecargado:

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
LIMIT 10

Es un buen hábito para limitar el uso si no hay dónde y cuándo hacer une. Comience con poco valor, comprobar qué tan pesado es la consulta y luego aumentar el límite.

    Find duplicate Records:

    Suppose we have table : Student 
    student_id int
    student_name varchar
    Records:
    +------------+---------------------+
    | student_id | student_name        |
    +------------+---------------------+
    |        101 | usman               |
    |        101 | usman               |
    |        101 | usman               |
    |        102 | usmanyaqoob         |
    |        103 | muhammadusmanyaqoob |
    |        103 | muhammadusmanyaqoob |
    +------------+---------------------+

    Now we want to see duplicate records
    Use this query:


   select student_name,student_id ,count(*) c from student group by student_id,student_name having c>1;

+--------------------+------------+---+
| student_name        | student_id | c |
+---------------------+------------+---+
| usman               |        101 | 3 |
| muhammadusmanyaqoob |        103 | 2 |
+---------------------+------------+---+

Para ver rápidamente las filas duplicadas puede ejecutar una sola consulta sencilla

Aquí estoy consultando la tabla y una lista de todas las filas duplicados con el mismo user_id, market_place y SKU:

select user_id, market_place,sku, count(id)as totals from sku_analytics group by user_id, market_place,sku having count(id)>1;

Para eliminar la fila duplicada que tiene que decidir qué fila que desea borrar. Por ejemplo, el que tiene ID baja (generalmente mayores) o tal vez alguna otra información de fecha. En mi caso, yo sólo quiero borrar la Identificación del menor ya que la nueva ID es información más reciente.

En primer lugar vuelva a comprobar si se eliminarán los registros correctos. Aquí estoy seleccionando el registro entre los duplicados que se borrarán (por id único).

select a.user_id, a.market_place,a.sku from sku_analytics a inner join sku_analytics b where a.id< b.id and a.user_id= b.user_id and a.market_place= b.market_place and a.sku = b.sku;

Luego ejecutar la consulta de eliminación para eliminar los duplicados:

delete a from sku_analytics a inner join sku_analytics b where a.id< b.id and a.user_id= b.user_id and a.market_place= b.market_place and a.sku = b.sku;

Copia de seguridad, verificación doble, verificar, comprobar a continuación, ejecutar la copia de seguridad.

select address from list where address = any (select address from (select address, count(id) cnt from list group by address having cnt > 1 ) as t1) order by address

la sub-consulta interna devuelve filas con dirección duplicada entonces la sub-consulta externa devuelve la columna de la dirección para la dirección con duplicados. la sub-consulta externa debe devolver sólo una columna, ya que utiliza como operando para el operador '= cualquier'

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top