Question Trouver des enregistrements en double dans MySQL


Je veux sortir des enregistrements en double dans une base de données MySQL. Cela peut être fait avec:

SELECT address, count(id) as cnt FROM list
GROUP BY address HAVING cnt > 1

Ce qui entraîne:

100 MAIN ST    2

Je voudrais le tirer pour qu'il montre chaque ligne qui est un doublon. Quelque chose comme:

JIM    JONES    100 MAIN ST
JOHN   SMITH    100 MAIN ST

Des pensées sur la façon dont cela peut être fait? J'essaie d'éviter de faire le premier puis de rechercher les doublons avec une deuxième requête dans le code.


579
2018-05-12 18:24


origine


Réponses:


La clé consiste à réécrire cette requête afin qu'elle puisse être utilisée en tant que sous-requête.

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;

617
2018-05-12 18:33



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

305
2018-03-19 17:57



Pourquoi ne pas simplement intégrer la table avec lui-même?

SELECT a.firstname, a.lastname, a.address
FROM list a
INNER JOIN list b ON a.address = b.address
WHERE a.id <> b.id

Un DISTINCT est nécessaire si l'adresse peut exister plus de deux fois.


190
2018-05-12 18:49



J'ai essayé la meilleure réponse choisie pour cette question, mais cela m'a un peu dérouté. J'avais vraiment besoin de ça sur un seul champ de ma table. L'exemple suivant de ce lien a très bien fonctionné pour moi:

SELECT COUNT(*) c,title FROM `data` GROUP BY title HAVING c > 1;

49
2018-01-08 13:45



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

C'est la même requête que vous avez demandée et son fonctionnement à 200% et facile aussi. Prendre plaisir!!!


39
2018-06-20 10:34



Trouver des utilisateurs en double par adresse e-mail avec cette requête ...

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;

34
2018-01-26 00:39



nous pouvons trouver les doublons dépend de plus d'un champs également.Pour ces cas, vous pouvez utiliser le format ci-dessous.

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

17
2018-03-02 07:04



Une autre solution serait d'utiliser des alias de table, comme ceci:

SELECT p1.id, p2.id, p1.address
FROM list AS p1, list AS p2
WHERE p1.address = p2.address
AND p1.id != p2.id

Tout ce que vous faites vraiment dans ce cas est de prendre l'original liste table, créant deux prependre les tables - p1 et p2 - à partir de cela, puis en effectuant une jointure sur la colonne d'adresse (ligne 3). La 4ème ligne s'assure que le même enregistrement n'apparaît pas plusieurs fois dans votre ensemble de résultats ("doublons dupliqués").


12
2018-06-14 04:14