web-dev-qa-db-fra.com

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

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

login_id | email
---------|---------------------
john     | [email protected]
peter    | [email protected]
johnny   | [email protected]
...

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

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

183
bobo

Cette requête vous donnera une liste d'adresses e-mail et le nombre de fois qu'elles ont été utilisées, en commençant par les adresses les plus utilisées.

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
)
300
Scott Saunders
select email from mytable group by email having count(*) >1
55
HLGEM

Voici la requête pour trouver les email qui sont utilisés depuis plus d'un login_id:

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

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

12
Ivan Nevostruev

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
9
Sergey Makhonin

utilisez ceci si votre colonne email contient des valeurs vides

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

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

SELECT * FROM member WHERE email = (Select email From member Where login_id = [email protected]) 

Tous les enregistrements contenant [email protected] comme valeur login_id seront renvoyés.

2
Marc L

Merci les gars :-) J'ai utilisé ce qui suit parce que je ne m'intéressais qu'à ces deux colonnes et pas tellement au reste. A bien fonctionné

  select email, login_id from table
    group by email, login_id
    having COUNT(email) > 1
1
Libertine

Obtenez l'enregistrement complet à votre guise à l'aide de la condition avec la requête de sélection interne.

SELECT *
FROM   member
WHERE  email IN (SELECT email
                 FROM   member
                 WHERE  login_id = [email protected]) 
0
Suba Karthikeyan