2010-05-21 4 views
6

j'ai une table comme celui-ciObtenir la liste de lignes en double dans MySql

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

je besoin d'une requête qui renverra tous les champs (select *) à partir des enregistrements qui ont le même Nachname et vorname (dans ce cas, enregistrements 1 et 2). Quelqu'un peut-il m'aider avec ça? Merci

Répondre

13

La requête suivante donnera la liste des doublons:

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 Les données que vous avez publié semble avoir tort « Doe » et « Chevalier » sont un nom, pas un prenom: p.

+2

Je juste besoin d'ajouter select distinct (la requête retournait 2 fois la même ligne). Merci de votre aide – user347033

11

La solution générale à votre problème est une question de la forme

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

Ceci renverra une ligne pour chaque jeu de ligne en double dans le tableau. La dernière colonne de ce résultat est le nombre de doublons pour les valeurs particulières.


Si vous voulez vraiment l'ID, essayez quelque chose comme ceci:

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 

ai pas testé si

+0

Cela ne renverrait pas réellement toutes les lignes, il trouverait simplement les lignes dupliquées. – jle

+0

C'est trop cher, vous pouvez le résoudre en utilisant une simple jointure (voir ma réponse: 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 

Cela devrait retourner toutes les colonnes de la table où il y a double nachname et vorname. Je recommande de changer * pour les colonnes exactes dont vous avez besoin. Editer: J'ai ajouté un max (id) pour que le groupe ne soit pas un problème. Ma requête n'est pas aussi élégante que je le voudrais. Il y a probablement un moyen plus simple de le faire.

+0

Hmm ... Je vois ce que tu veux dire maintenant. Mais je suis sûr que votre requête est fausse. Vous ne pouvez pas retourner 'id' si vous ne l'utilisez pas pour' grouper par '. – ewernli

+0

Cette jointure ne fonctionne pas - il n'y a pas de colonne "id" dans la requête t2. –

+0

Ceci est tout simplement faux ... Le groupe par éliminera en fait tous les doublons que vous avez si vous utilisez MySQL puisque vous ne faites que grouper sur nachname et vorname, donc il retournera 1 ligne, avec 1 ID, au lieu de tous les caractères distinctifs lignes comme vous l'avez probablement attendu (essayez-le, vous verrez). Oh, et tout autre RDBMS se plaindrait de votre groupe par (ce qui est imho la seule façon correcte, je déteste MySQL en essayant de deviner ce que vous voulez et d'exécuter ces requêtes erronées au lieu de lancer une erreur). – wimvds

2

Vous pouvez le faire avec un autojointure:

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 

le t1.id<>t2.id est nécessaire pour éviter ids correspondant contre eux-mêmes. (Si vous voulez seulement 1 ligne de chaque ensemble de doublons, vous pouvez utiliser t1.id<t2.id).

+0

Non, celui-là retournera seulement 1 ligne avec les 2 enregistrements correspondants dedans, pas les 2 lignes qu'il devrait retourner ... – wimvds

+0

@wimvds vrai, si vous voulez toutes les lignes dupliquées (au lieu de 1 rangée de chaque ensemble dupliqué, vous devez utiliser <>) –

Questions connexes