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)

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
)

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


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.


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

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

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ść jan123@hotmail.com jako wartość id_logowania.


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

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) 
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.