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)

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
)

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


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.


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

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 != ''
    )

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 john123@hotmail.com comme valeur login_id.


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

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) 
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.