2009-11-23 6 views
142

In einer [member] -Tabelle haben einige Zeilen den gleichen Wert für die Spalte email.Finden Sie Zeilen mit demselben Wert für eine Spalte in MySQL

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

Einige Benutzer verwendeten eine andere login_id, aber dieselbe E-Mail-Adresse, für diese Spalte wurde keine eindeutige Einschränkung festgelegt. Jetzt muss ich diese Reihen finden und sehen, ob sie entfernt werden sollten.

Welche SQL-Anweisung sollte ich verwenden, um diese Zeilen zu finden? (MySQL 5)

Antwort

227

Diese Abfrage gibt Ihnen eine Liste der E-Mail-Adressen und wie oft sie verwendet werden, mit den am häufigsten verwendeten Adressen zuerst.

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

Wenn Sie die vollständigen Reihen wollen:

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

'count (1)' funktioniert gleich gut und ist leistungsfähiger. (Gelernt, dass Trick von [so] ;-) – jpaugh

+3

Funktioniert nicht mit Postgres. – jhrr

+1

@jpaugh, könnte nicht verwenden, zählen (1) 'https://stackoverflow.com/questions/2710621/count-vs-count1-vs-countpk-which-isbetter – Storm

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

Die akzeptierte Antwort mit Postgres nicht funktioniert, dieses tut. – azio

+0

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

10

Hier Abfrage email ‚s zu finden, die verwendet werden, um mehr als ein login_id:

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

Sie werden zweite benötigen (verschachtelte) Abfrageliste von login_id zu erhalten von email.

9

Erster Teil der akzeptierten Antwort funktioniert nicht für MSSQL.
Dieser arbeitete für mich:

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

Danke Jungs :-) ich die unten verwendet, weil ich nur über diese beiden Säulen und nicht so sehr um den Rest gekümmert. Arbeitete groß

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

In dem Fall, COUNT (E-Mail) wäre immer 1, so dass die Abfrage nichts zurückgibt. – jutky

2

verwenden diese, wenn Ihre E-Mail-Spalte enthält leere Werte

select * from table where email in (
    select email from table group by email having count(*) > 1 and email != '' 
    ) 
Verwandte Themen