Znajdź wiersze o tej samej wartości w kolumnie w MySQL

209

W tabeli [element członkowski] niektóre wiersze mają tę samą wartość dla emailkolumny.

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

Niektóre osoby używały innego login_id, ale tego samego adresu e-mail, w tej kolumnie nie ustawiono żadnego wyjątkowego ograniczenia. Teraz muszę znaleźć te wiersze i sprawdzić, czy powinny zostać usunięte.

Jakiej instrukcji SQL należy użyć, aby znaleźć te wiersze? (MySQL 5)

Bobo
źródło

Odpowiedzi:

341

To zapytanie daje listę adresów e-mail i liczbę ich użycia, z najczęściej używanymi adresami jako pierwszymi.

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

Jeśli chcesz pełne wiersze:

select * from table where email in (
    select email from table
    group by email having count(*) > 1
)
Scott Saunders
źródło
1
count(1)działa równie dobrze i jest bardziej wydajny. (Nauczyłem się tej sztuczki z Przepełnienia stosu ;-)
jpaugh
3
@jpaugh, może nie chcieć używać count(1) stackoverflow.com/questions/2710621/…
Storm
utworzył coś, co było zasadniczo nieskończoną rekurencją lub czymś w mysql, powodując martwą bazę danych z powodu „zbyt wielu połączeń”: - /
huygir
56
select email from mytable group by email having count(*) >1
HLGEM
źródło
7
Akceptowana odpowiedź nie działa z Postgres, ta właśnie działa.
Azio,
@HLGEM: stackoverflow.com/questions/41359879/...
Syed Asad Abbas Zaidi
13

Oto zapytanie, które pozwala znaleźć emailwięcej niż jeden login_id:

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

Będziesz potrzebować drugiego (zagnieżdżonego) zapytania, aby uzyskać listę login_idwedług email.

Ivan Nevostruev
źródło
10

Pierwsza część zaakceptowanej odpowiedzi nie działa dla MSSQL.
To działało dla mnie:

select email, COUNT(*) as C from table 
group by email having COUNT(*) >1 order by C desc
Siergiej Makhonin
źródło
5

użyj tego, jeśli kolumna e-mail zawiera puste wartości

 select * from table where email in (
    select email from table group by email having count(*) > 1 and email != ''
    )
ramesh kumar
źródło
3

Wiem, że to bardzo stare pytanie, ale dotyczy to kogoś innego, kto może mieć ten sam problem, i myślę, że jest to bardziej dokładne w stosunku do tego, czego chciał.

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

Spowoduje to zwrócenie wszystkich rekordów, które mają wartość [email protected] jako wartość id_logowania.

Marc L.
źródło
2

Dzięki chłopaki :-) Użyłem poniżej, ponieważ zależało mi tylko na tych dwóch kolumnach, a nie na reszcie. Działa świetnie

  select email, login_id from table
    group by email, login_id
    having COUNT(email) > 1
Libertyn
źródło
2
W takim przypadku COUNT (e-mail) zawsze będzie wynosić 1, więc zapytanie nie zwróci niczego.
jutky
Nie, zapytanie faktycznie dało mi dane, których potrzebowałem, czyli wyraźnie e-mail i login_name tych, którzy mają ten sam e
Libertine
Jeśli grupujesz według adresu e - mail i login_id, policzysz liczbę wierszy dla tego samego adresu e-mail i loginu, a te są różne w twoim przykładzie, więc liczba będzie zawsze wynosić 1. Oto skrzypce z zapytaniem, które zwraca 0 wierszy: sqlfiddle. com / #! 9 / 4bbcaf / 3
jutky
1

Uzyskaj cały rekord, jak chcesz, używając warunku z wewnętrznym zapytaniem select.

SELECT *
FROM   member
WHERE  email IN (SELECT email
                 FROM   member
                 WHERE  login_id = abcd.user@hotmail.com) 
Suba Karthikeyan
źródło