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 extraerlo 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 el primero y luego buscar los duplicados con una segunda consulta en el código.
mysql
duplicates
Chris Bartow
fuente
fuente
fuente
->having(DB::raw('count(*)'), '>', 2)
a la consulta. ¡Muchas gracias!>=2
? Solo useHAVING COUNT(*) > 1
¿Por qué no solo INNER SE UNE a la mesa consigo mismo?
Se necesita una DISTINCT si la dirección puede existir más de dos veces.
fuente
WHERE a.id > b.id
filtrar solo los duplicados más nuevos, de esa manera puedo hacer unDELETE
directamente en el resultado. Cambie la comparación para enumerar los duplicados más antiguos.Intenté la mejor respuesta elegida para esta pregunta, pero me confundió un poco. En realidad lo necesitaba solo en un solo campo de mi mesa. El siguiente ejemplo de este enlace funcionó muy bien para mí:
fuente
Esta es la consulta similar que ha solicitado y es 200% funcional y también fácil. ¡¡¡Disfrutar!!!
fuente
¿No es esto más fácil?
?
fuente
Encuentre usuarios duplicados por dirección de correo electrónico con esta consulta ...
fuente
podemos encontrar que los duplicados dependen de más de un campo también. Para esos casos, puede usar el siguiente formato.
fuente
Encontrar direcciones duplicadas es mucho más complejo de lo que parece, especialmente si necesita precisión. Una consulta MySQL no es suficiente en este caso ...
Trabajo en SmartyStreets , donde abordamos la validación y la desduplicación y otras cosas, y he visto muchos desafíos diversos con problemas similares.
Hay varios servicios de terceros que marcarán 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 dirección. El USPS (para la 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 la mejor respuesta para usted es exportar la tabla a un archivo CSV, por ejemplo, y enviarla a un procesador de listas capaz. Una de ellas es SmartyStreets Bulk Address Validation Tool, que lo hará por usted en unos segundos a unos minutos automáticamente. Marcará filas duplicadas con un nuevo campo llamado "Duplicar" y un valor
Y
en él.fuente
Otra solución sería usar alias de tabla, así:
Todo lo que realmente está haciendo en este caso es tomar el original lista de la tabla, la creación de dos p mesas retend - p 1 y p 2 - Fuera de eso, y luego realizar 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 aparezca varias veces en su conjunto de resultados ("duplicados duplicados").
fuente
No va a ser muy eficiente, pero debería funcionar:
fuente
Esto seleccionará duplicados en una pasada de tabla, sin subconsultas.
Esta consulta emula realmente
ROW_NUMBER()
presente enOracle
ySQL Server
Vea el artículo en mi blog para más detalles:
MySQL
.fuente
FROM (SELECT ...) aoo
es una trampa, pero es una subconsulta :-PEsto también le mostrará cuántos duplicados tiene y ordenará los resultados sin combinaciones.
fuente
fuente
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 ) dup ON users.mail = dup.mail ORDER BY users.mail, users.created;
Para tu mesa sería algo así como
Esta consulta le dará todas las entradas de dirección distintas en su tabla de lista ... No estoy seguro de cómo funcionará si tiene valores de clave principal para el nombre, etc.
fuente
Procedimiento de consultas de eliminación de duplicados más rápido:
fuente
Personalmente, esta consulta ha resuelto mi problema:
Lo que hace este script es mostrar todos los ID de suscriptor que existen más de una vez en la tabla y la cantidad de duplicados encontrados.
Estas son las columnas de la tabla:
¡Espero que sea útil para ti!
fuente
Reemplace la ciudad con su mesa. Reemplace el nombre con el nombre de su campo
fuente
fuente
fuente
Para ver rápidamente las filas duplicadas, puede ejecutar una única consulta simple
Aquí estoy consultando la tabla y enumerando todas las filas duplicadas con el mismo user_id, market_place y sku:
Para eliminar la fila duplicada, debe decidir qué fila desea eliminar. Por ejemplo, el que tiene un ID más bajo (generalmente más antiguo) o tal vez alguna otra información de fecha. En mi caso, solo quiero eliminar la identificación más baja, ya que la identificación más nueva es la información más reciente.
Primero verifique si se eliminarán los registros correctos. Aquí estoy seleccionando el registro entre los duplicados que se eliminarán (por identificación única).
Luego ejecuto la consulta de eliminación para eliminar los engaños:
Copia de seguridad, doble verificación, verificar, verificar la copia de seguridad y luego ejecutarla.
fuente
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 '= any'
fuente
Respuesta de Powerlord es la mejor y recomendaría un cambio más: use LIMIT para asegurarse de que db no se sobrecargue:
Es una buena costumbre 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.
fuente