Rechercher des lignes qui ont la même valeur sur une colonne dans MySQL

209

Dans une table [membre], certaines lignes ont la même valeur pour la emailcolonne.

login_id | email
---------|---------------------
john     | john123@hotmail.com
peter    | peter456@gmail.com
johnny   | john123@hotmail.com
...

Certaines personnes ont utilisé un identifiant de connexion différent mais la même adresse e-mail, aucune contrainte unique n'a été définie sur cette colonne. Maintenant, je dois trouver ces lignes et voir si elles doivent être supprimées.

Quelle instruction SQL dois-je utiliser pour rechercher ces lignes? (MySQL 5)

bobo
la source

Réponses:

342

Cette requête vous donnera une liste des adresses e-mail et combien de fois elles sont utilisées, avec les adresses les plus utilisées en premier.

SELECT email,
       count(*) AS c
FROM TABLE
GROUP BY email
HAVING c > 1
ORDER BY c DESC

Si vous voulez les lignes complètes:

select * from table where email in (
    select email from table
    group by email having count(*) > 1
)
Scott Saunders
la source
1
count(1)fonctionne aussi bien et est plus performant. (
J'ai
3
@jpaugh, pourrait ne pas vouloir utiliser count(1) stackoverflow.com/questions/2710621/…
Storm
créé ce qui était essentiellement une récursion infinie ou quelque chose sur mysql résultant en une base de données morte en raison de "trop ​​de connexions": - /
huygir
56
select email from mytable group by email having count(*) >1
HLGEM
la source
7
La réponse acceptée ne fonctionne pas avec Postgres, celle-ci le fait.
azio
@HLGEM: stackoverflow.com/questions/41359879/…
Syed Asad Abbas Zaidi
13

Voici une requête pour trouver ceux emailqui sont utilisés pour plus d'un login_id:

SELECT email
FROM table
GROUP BY email
HAVING count(*) > 1

Vous aurez besoin d'une seconde requête (imbriquée) pour obtenir la liste de login_idby email.

Ivan Nevostruev
la source
10

La première partie de la réponse acceptée ne fonctionne pas pour MSSQL.
Cela a fonctionné pour moi:

select email, COUNT(*) as C from table 
group by email having COUNT(*) >1 order by C desc
Sergey Makhonin
la source
5

utilisez-le si votre colonne e-mail contient des valeurs vides

 select * from table where email in (
    select email from table group by email having count(*) > 1 and email != ''
    )
ramesh kumar
la source
3

Je sais que c'est une très vieille question, mais c'est plus pour quelqu'un d'autre qui pourrait avoir le même problème et je pense que c'est plus précis à ce qui était voulu.

SELECT * FROM member WHERE email = (Select email From member Where login_id = john123@hotmail.com) 

Cela renverra tous les enregistrements qui ont [email protected] comme valeur login_id.

Marc L
la source
2

Merci les gars :-) J'ai utilisé ce qui suit parce que je ne me souciais que de ces deux colonnes et pas tellement du reste. Fonctionne très bien

  select email, login_id from table
    group by email, login_id
    having COUNT(email) > 1
Libertin
la source
2
Dans le cas en question, COUNT (e-mail) serait toujours égal à 1, donc votre requête ne retournera rien.
jutky
1
Non, la requête m'a en fait donné les données dont j'avais besoin, qui sont distinctement l'adresse e-mail et le nom de connexion de ceux qui ont le même e
Libertine
Si vous regroupez par e - mail et login_id, vous compterez le nombre de lignes pour le même e-mail et la même connexion, et celles-ci sont distinctes dans votre exemple, donc le nombre sera toujours égal à
jutky
1

Obtenez l'intégralité de l'enregistrement comme vous le souhaitez en utilisant la condition avec la requête de sélection interne.

SELECT *
FROM   member
WHERE  email IN (SELECT email
                 FROM   member
                 WHERE  login_id = abcd.user@hotmail.com) 
Suba Karthikeyan
la source