valores solo seleccionar saber repetidos registros query para mostrar hay evitar encontrar eliminar duplicados datos agrupar mysql duplicates

solo - saber si hay registros duplicados mysql



Encuentra registros duplicados en MySQL (22)

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 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.


¿No es esto más fácil?

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

?


¿Por qué no solo UNIRSE ÚNICAMENTE a la mesa?

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 un DISTINTO si la dirección puede existir más de dos veces.


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

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

Hay varios servicios de terceros que marcarán los duplicados en una lista para usted. Hacer esto únicamente con una subconsulta MySQL no tendrá en cuenta las diferencias en los formatos y estándares de direcciones. El USPS (para la dirección de los EE. UU.) Tiene ciertas pautas para hacer este estándar, 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 se lo hará por usted en unos pocos segundos a unos pocos minutos automáticamente. Marcará filas duplicadas con un nuevo campo llamado "Duplicar" y un valor de Y en él.


Encuentra 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;


Esto seleccionará duplicados en una tabla, no subconsultas.

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

Esta consulta emula de forma ROW_NUMBER() presente en Oracle y SQL Server

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


Esto también le mostrará cuántos duplicados tiene y ordenará los resultados sin uniones

SELECT `Language` , id, COUNT( id ) AS how_many FROM `languages` GROUP BY `Language` HAVING how_many >=2 ORDER BY how_many DESC


Intenté la mejor respuesta elegida para esta pregunta, pero me confundió un poco. De hecho, lo necesitaba 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;


La clave es volver a escribir esta consulta para que se pueda utilizar 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;


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;


Otra solución sería usar alias de tablas, de esta manera:

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á haciendo en este caso es tomar la tabla de la lista original, crear dos tablas de retenciones p ( p 1 y p 2 ), 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").


Personalmente 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 es mostrar todos los ID de suscriptor que existen más de una vez en la tabla y el número de duplicados encontrados.

Estas son las columnas de la 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 | |

Espero que te sea de ayuda!


Podemos encontrar que los duplicados también dependen de más de un campo. Para esos casos, puede usar el formato a continuación.

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


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

/* 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;


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 subconsulta interna devuelve filas con una dirección duplicada, luego la subconsulta externa devuelve la columna de dirección para la dirección con duplicados. la subconsulta externa debe devolver solo una columna porque se usó como operando para el operador ''= cualquiera''


La respuesta de Powerlord es sin duda la mejor y recomendaría un cambio más: use LIMIT para asegurarse de que db no se sobrecargue:

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 usar LIMIT si no hay DONDE y al hacer uniones. Comience con un valor pequeño, verifique qué tan pesada es la consulta y luego aumente 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 | +---------------------+------------+---+


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


SELECT firstname, lastname, address FROM list WHERE Address in (SELECT address FROM list GROUP BY address HAVING count(*) > 1)


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


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

Reemplaza la ciudad con tu mesa. Reemplace el nombre con su nombre de campo


select * from table_name t1 inner join (select distinct <attribute list> from table_name as temp)t2 where t1.attribute_name = t2.attribute_name

Para tu 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 la tabla de su lista ... No estoy seguro de cómo funcionará si tiene valores de clave principal para el nombre, etc.


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

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