2010-05-21 21 views
6

tengo una tabla como éstaObtener lista de filas duplicadas en MySQL

ID  nachname  vorname 
1  john   doe 
2  john   doe 
3  jim   doe 
4  Michael  Knight 

necesito una consulta que devolverá todos los campos (seleccionar *) a partir de los registros que tienen el mismo Apellido y vorname (en este caso, registros 1 y 2). ¿Alguien puede ayudarme con esto? Gracias

Respuesta

13

La siguiente consulta dará la lista de duplicados:

SELECT n1.* FROM table n1 
inner join table n2 on n2.vorname=n1.vorname and n2.nachname=n1.nachname 
where n1.id <> n2.id 

BTW Los datos informados parece estar mal "Doe" y "Knight" es un apellido, no un nombre: p.

+2

Solo necesitaba agregar seleccionar distinto (la consulta devolvía 2 veces la misma fila). Gracias por tu ayuda – user347033

11

La solución general a su problema es una consulta de la forma

SELECT col1, col2, count(*) 
FROM t1 
GROUP BY col1, col2 
HAVING count(*) > 1 

Esto devolverá una fila por cada conjunto de fila duplicada en la tabla. La última columna en este resultado es la cantidad de duplicados para los valores particulares.


Si realmente desea la identificación, intentar algo como esto:

SELECT id FROM 
t1, 
(SELECT col1, col2, count(*) 
    FROM t1 
    GROUP BY col1, col2 
    HAVING count(*) > 1) as t2 
WHERE t1.col1 = t2.col1 AND t1.col2 = t2.col2 

no lo he probado, aunque

+0

Esto realmente no devolvería todas las filas, solo encontraría las filas duplicadas. – jle

+0

Esto es muy caro, puedes resolverlo usando una simple combinación (ver mi respuesta: p). – wimvds

0
select * from table AS t1 inner join 
(select max(id) As id,nachname,vorname, count(*) 
from t1 group by nachname,vorname 
having count(*) >1) AS t2 on t1.id=t2.id 

Esto debería devolver todas las columnas de la tabla donde hay nachname y vorname duplicados. Recomiendo cambiar * a las columnas exactas que necesita.

Editar: He añadido un max (id) para que el grupo no sea un problema. Mi consulta no es tan elegante como me gustaría. Probablemente haya una manera más fácil de hacerlo.

+0

Hmm ... Veo a qué te refieres ahora. Pero estoy bastante seguro de que tu consulta es incorrecta. No puede devolver 'id' si no lo está usando para' group by'. – ewernli

+0

Esa combinación no funciona; no hay una columna 'id' en la consulta t2. –

+0

Esto es descaradamente erróneo ... El grupo de hecho eliminará cualquier duplicado que tenga si usa MySQL ya que solo agrupa en nachname y vorname, por lo que devolverá 1 fila, con 1 ID, en lugar de todos los distintivos filas como probablemente esperabas (solo pruébalo, ya verás). Ah, y cualquier otro RDBMS se quejaría de tu grupo (que es la única forma correcta, odio MySQL intentando adivinar lo que quieres y ejecutar estas consultas erróneas en lugar de arrojar un error). – wimvds

2

Puede hacerlo con una autocombinación:

select distinct t1.id from t as t1 inner join t as t2 
on t1.col1=t2.col1 and t1.col2=t2.col2 and t1.id<>t2.id 

la t1.id<>t2.id es necesario evitar las identificaciones juego contra ellos mismos. (Si solo desea 1 fila de cada conjunto de duplicados, puede usar t1.id<t2.id).

+0

No, ese solo devolverá 1 fila con los 2 registros coincidentes, no las 2 filas que debería devolver ... – wimvds

+0

@wimvds true, si desea todas las filas duplicadas (en lugar de 1 fila de cada conjunto duplicado, debería usar <>) –

Cuestiones relacionadas