Suchen Sie in MySQL nach Zeilen mit demselben Wert in einer Spalte

209

In einer [member] -Tabelle haben einige Zeilen denselben Wert für die emailSpalte.

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

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

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

Bobo
quelle

Antworten:

341

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

SELECT email,
       count(*) AS c
FROM TABLE
GROUP BY email
HAVING c > 1
ORDER BY c DESC

Wenn Sie die vollständigen Zeilen möchten:

select * from table where email in (
    select email from table
    group by email having count(*) > 1
)
Scott Saunders
quelle
1
count(1)funktioniert genauso gut und ist performanter. (Gelernt , dass Trick von Stack - Überlauf ;-)
jpaugh
3
@jpaugh, möchte möglicherweise nicht count(1) stackoverflow.com/questions/2710621/…
Storm
erstellt, was im Wesentlichen unendliche Rekursion oder etwas auf MySQL war, was zu einer toten Datenbank aufgrund "zu vieler Verbindungen" führte: - /
Huygir
56
select email from mytable group by email having count(*) >1
HLGEM
quelle
7
Die akzeptierte Antwort funktioniert nicht mit Postgres, diese funktioniert.
Azio
@HLGEM: stackoverflow.com/questions/41359879/…
Syed Asad Abbas Zaidi
13

Hier ist eine Abfrage, um zu finden email, welche für mehr als eine verwendet werden login_id:

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

Sie benötigen eine zweite (verschachtelte) Abfrage, um eine Liste login_idvon zu erhalten email.

Ivan Nevostruev
quelle
10

Der erste Teil der akzeptierten Antwort funktioniert nicht für MSSQL.
Das hat bei mir funktioniert:

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

Verwenden Sie diese Option, wenn Ihre E-Mail-Spalte leere Werte enthält

 select * from table where email in (
    select email from table group by email having count(*) > 1 and email != ''
    )
Ramesh Kumar
quelle
3

Ich weiß, dass dies eine sehr alte Frage ist, aber dies ist mehr für jemanden, der möglicherweise das gleiche Problem hat, und ich denke, dass dies genauer ist als das, was gewünscht wurde.

SELECT * FROM member WHERE email = (Select email From member Where login_id = john123@hotmail.com) 

Dies gibt alle Datensätze zurück, die [email protected] als login_id-Wert haben.

Marc L.
quelle
2

Danke Jungs :-) Ich habe das Folgende benutzt, weil ich mich nur um diese beiden Spalten gekümmert habe und nicht so sehr um den Rest. Hat super funktioniert

  select email, login_id from table
    group by email, login_id
    having COUNT(email) > 1
Wüstling
quelle
2
In dem fraglichen Fall wäre COUNT (E-Mail) immer 1, sodass Ihre Abfrage nichts zurückgibt.
Jutky
Nein, die Abfrage gab mir tatsächlich die Daten, die ich brauchte. Dies ist eindeutig die E-Mail-Adresse und der Anmeldename derjenigen, die dieselbe E-Mail-Adresse haben
Libertine
Wenn Sie nach E-Mail und Anmelde-ID gruppieren, zählen Sie die Anzahl der Zeilen für dieselbe E-Mail und Anmeldung. Diese sind in Ihrem Beispiel unterschiedlich, sodass die Anzahl immer 1 beträgt. Hier ist die Geige mit Ihrer Abfrage, die 0 Zeilen zurückgibt
jutky
1

Rufen Sie den gesamten Datensatz mit der Bedingung mit innerer Auswahlabfrage nach Ihren Wünschen ab.

SELECT *
FROM   member
WHERE  email IN (SELECT email
                 FROM   member
                 WHERE  login_id = abcd.user@hotmail.com) 
Suba Karthikeyan
quelle