Trova le righe che hanno lo stesso valore su una colonna in MySQL


209

In una tabella [membro], alcune righe hanno lo stesso valore per la emailcolonna.

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

Alcune persone hanno utilizzato un login_id diverso ma lo stesso indirizzo e-mail, nessun vincolo univoco è stato impostato su questa colonna. Ora devo trovare queste righe e vedere se devono essere rimosse.

Quale istruzione SQL dovrei usare per trovare queste righe? (MySQL 5)

Risposte:


341

Questa query ti fornirà un elenco di indirizzi e-mail e quante volte vengono utilizzati, con prima gli indirizzi più utilizzati.

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

Se vuoi le righe complete:

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

1
count(1)funziona ugualmente bene ed è più performante. (
Ho

3
@jpaugh, potrebbe non voler utilizzare count(1) stackoverflow.com/questions/2710621/…
Storm

creato ciò che era essenzialmente una ricorsione infinita o qualcosa su mysql risultante in un database morto a causa di "troppe connessioni": - /
huygir


13

Ecco una query per trovare quelli emailche vengono utilizzati per più di uno login_id:

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

Avrete bisogno di secondo (di nidificato) query per ottenere la lista dei login_idby email.


10

La prima parte della risposta accettata non funziona per MSSQL.
Questo ha funzionato per me:

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

5

usalo se la tua colonna email contiene valori vuoti

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

3

So che questa è una domanda molto vecchia, ma è più per qualcun altro che potrebbe avere lo stesso problema e penso che questo sia più accurato di ciò che si voleva.

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

Ciò restituirà tutti i record che hanno john123@hotmail.com come valore login_id.


2

Grazie ragazzi :-) Ho usato il seguito perché mi importava solo di quelle due colonne e non tanto del resto. Ha funzionato alla grande

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

2
Nel caso in questione, COUNT (e-mail) sarà sempre 1, quindi la query non restituirà nulla.
Jutky

No, la query in realtà mi ha dato i dati di cui avevo bisogno, che è chiaramente l'e-mail e il nome_accesso di coloro che hanno la stessa e
Libertine,

Se si raggruppa via e-mail esegui il e e login_id, conterai la quantità di righe per la stessa e-mail e lo stesso login e queste sono distinte nel tuo esempio, quindi il conteggio sarà sempre 1. Ecco il violino con la tua query che restituisce 0 righe: sqlfiddle. com / #! 9 / 4bbcaf / 3
jutky

1

Ottieni l'intero record come desideri utilizzando la condizione con la query di selezione interna.

SELECT *
FROM   member
WHERE  email IN (SELECT email
                 FROM   member
                 WHERE  login_id = abcd.user@hotmail.com) 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.