7
votes

Obtenez la liste des lignes en double dans mysql

J'ai une table comme celle-ci xxx

J'ai besoin d'une requête qui retournera tous les champs (sélectionnez *) dans les enregistrements qui ont le même nachname et Vorname (dans ce cas, enregistrements 1 et 2). Est-ce que quelqu'un peut m'aider avec ça? Merci


0 commentaires

4 Réponses :


11
votes

La solution générale à votre problème est une requête du formulaire

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 


2 commentaires

Cela ne retournerait pas toutes les lignes, il ne ferait que trouver les lignes en double.


C'est un moyen coûteux, vous pouvez le résoudre à l'aide d'une jointure simple (voir ma réponse: p).



0
votes
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
This should return ALL of the columns from the table where there is duplicate nachname and vorname.  I recommend changing * to the exact columns that you need.Edit: I added a max(id) so that the group by wouldn't be a problem.  My query isn't as elegant as I would want though.  There's probably an easier way to do it.

3 commentaires

Hmm ... je vois ce que tu veux dire maintenant. Mais je suis à peu près sûr que votre requête est fausse. Vous ne pouvez pas retourner id si vous n'utilisez pas le groupe par .


Cette jointure ne fonctionne pas - il n'y a pas de colonne ID dans la requête T2.


Ceci est juste très faux ... Le groupe par volonté éliminera les doublons que vous avez si vous utilisez MySQL, car vous ne regroupez que Nachname et Vorname, il retournera donc 1 ligne, avec 1 ID, au lieu de toutes les lignes distinctives. Comme vous êtes probablement attendu (essayez-le, vous verrez). Oh, et tout autre SGBDM se plaint de votre groupe par (qui est imho la seule façon correcte, je déteste MySQL essayant de deviner ce que vous voulez et exécutez ces requêtes erronées au lieu de lancer une erreur).



2
votes

Vous pouvez le faire avec une jointure auto-jointure: xxx

t1.id <> t2.id est nécessaire pour éviter les identifiants correspondant à eux-mêmes. (Si vous ne voulez que 1 rangée de chaque ensemble de duplicats, vous pouvez utiliser t1.id ).


2 commentaires

Nope, celui-là ne rentrera que 1 rangée avec les 2 enregistrements correspondants, pas les 2 rangées qu'il devraient revenir ...


@wimvds True, si vous voulez toutes les lignes en double (au lieu de 1 rangée de chaque ensemble en double, vous devez utiliser <>)



15
votes

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


2 commentaires

J'ai juste besoin d'ajouter Sélectionner distinct (la requête renvoyait 2 fois la même ligne). Merci de votre aide


Remarque: Si les champs "Vorname" et "Nachname" sont nullables, la fonction "regroupement" doit être utilisée pour une comparaison. Voir: Stackoverflow.com/questions/9608639 / ...