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)

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
)

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


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.


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

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

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 john123@hotmail.com als login_id-Wert haben.


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

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) 
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.