290 votes

Trouver les lignes qui ont la même valeur sur une colonne dans MySQL

Dans un tableau [membre], certaines rangées ont la même valeur pour la variable email colonne.

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

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

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

462voto

Scott Saunders Points 12721

Cette requête vous donnera une liste d'adresses électroniques et le nombre de fois qu'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 les rangs complets :

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

4 votes

count(1) fonctionne aussi bien, et est plus performant. (Cette astuce m'a été enseignée par Stack Overflow ;-)

6 votes

@jpaugh, vous pourriez ne pas vouloir utiliser count(1) stackoverflow.com/questions/2710621/

1 votes

A créé ce qui était essentiellement une récursion infinie ou quelque chose comme ça sur mysql, résultant en une base de données morte à cause de "trop de connexions" :-/

82voto

HLGEM Points 54641
select email from mytable group by email having count(*) >1

19 votes

La réponse acceptée ne fonctionne pas avec Postgres, celle-ci oui.

1 votes

18voto

Ivan Nevostruev Points 14934

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

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

Vous aurez besoin de la deuxième (des requêtes imbriquées) pour obtenir la liste des éléments suivants login_id par email .

13voto

Sergey Makhonin Points 28

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

select email, COUNT(*) as C from table 
group by email having COUNT(*) >1 order by C desc

7voto

ramesh kumar Points 71

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X