2009-11-23 5 views
142

Dans une table [membre], certaines lignes ont la même valeur pour la colonne email.Recherche de lignes ayant la même valeur sur une colonne dans MySQL

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

Certaines personnes utilisaient un identifiant de connexion différent mais la même adresse électronique, aucune contrainte unique n'a été définie dans cette colonne. Maintenant, je dois trouver ces lignes et voir si elles devraient être enlevées.

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

Répondre

227

Cette requête vous donnera une liste d'adresses électroniques et le nombre de fois où elles sont 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 que les lignes complètes:

select * from table where email in (
    select email from table 
    group by email having count(*) > 1 
) 
+0

'count (1)' fonctionne aussi bien et est plus performant. (A appris cette astuce de [so] ;-) – jpaugh

+3

Ne fonctionne pas avec postgres. – jhrr

+1

@jpaugh, pourrait ne pas vouloir utiliser 'count (1)' https://stackoverflow.com/questions/2710621/count-vs-count1-vs-countpk-which-is-better – Storm

44
select email from mytable group by email having count(*) >1 
+4

La réponse acceptée ne fonctionne pas avec Postgres, celui-ci fait. – azio

+0

@HLGEM: http://stackoverflow.com/questions/41359879/postgresql-get-records-having-similar-column-values ​​ –

10

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

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

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

9

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 
1

Merci les gars :-) J'ai utilisé le ci-dessous parce que je ne me souciais au sujet de ces deux colonnes et non pas tant sur le reste. A travaillé grand

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

Dans le cas en question, COUNT (email) serait toujours 1, de sorte que vous requête ne retournera rien. – jutky

2

utiliser cette option 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 != '' 
    ) 
Questions connexes