2010-05-21 19 views
6

ho una tabella come questaOttenere lista di righe duplicate in MySql

ID  nachname  vorname 
1  john   doe 
2  john   doe 
3  jim   doe 
4  Michael  Knight 

Ho bisogno di una query che restituirà tutti i campi (select *) dalle registrazioni che hanno lo stesso cognome e vorname (in questo caso, record 1 e 2). Qualcuno può aiutarmi con questo? Grazie

risposta

13

La seguente query darà la lista dei duplicati:

SELECT n1.* FROM table n1 
inner join table n2 on n2.vorname=n1.vorname and n2.nachname=n1.nachname 
where n1.id <> n2.id 

BTW I dati che hai postato sembra essere sbagliato "Doe" e "Cavaliere" sono un cognome, non un cognome: p.

+2

Ho solo bisogno di aggiungere select distinto (la query restituiva 2 volte la stessa riga). grazie per l'aiuto – user347033

11

La soluzione generale al problema è una query della forma

SELECT col1, col2, count(*) 
FROM t1 
GROUP BY col1, col2 
HAVING count(*) > 1 

Ciò restituirà una riga per ogni set di riga duplicata nella tabella. L'ultima colonna in questo risultato è il numero di duplicati per i valori specifici.


Se si vuole veramente l'ID, provare qualcosa di simile:

SELECT id FROM 
t1, 
(SELECT col1, col2, count(*) 
    FROM t1 
    GROUP BY col1, col2 
    HAVING count(*) > 1) as t2 
WHERE t1.col1 = t2.col1 AND t1.col2 = t2.col2 

non ho ancora testato, però

+0

Questo in realtà non restituirebbe tutte le righe, troverebbe solo le righe duplicate. – jle

+0

È molto costoso, puoi risolverlo usando un semplice join (vedi la mia risposta: p). – wimvds

0
select * from table AS t1 inner join 
(select max(id) As id,nachname,vorname, count(*) 
from t1 group by nachname,vorname 
having count(*) >1) AS t2 on t1.id=t2.id 

Ciò dovrebbe restituire tutte le colonne della tabella in cui c'è il nachname e il vorname duplicati. Raccomando di cambiare * con le colonne esatte di cui hai bisogno.

Modifica: ho aggiunto un massimo (id) in modo che il gruppo non costituisse un problema. La mia richiesta non è elegante come vorrei però. C'è probabilmente un modo più semplice per farlo.

+0

Hmm ... Capisco cosa intendi ora. Ma sono abbastanza sicuro che la tua domanda sia sbagliata. Non puoi restituire 'id' se non lo stai usando per' raggruppare per''. – ewernli

+0

Quel join non funziona - non c'è la colonna 'id' nella query t2. –

+0

Questo è palesemente sbagliato ... Il gruppo eliminerà infatti qualsiasi duplicato che si ha se si utilizza MySQL poiché si raggruppa solo su nachname e vorname, quindi restituirà 1 riga, con 1 ID, invece di tutti gli elementi distintivi file come probabilmente vi aspettavate (provatelo, vedrete). Oh, e qualsiasi altro RDBMS si lamenterebbe del tuo gruppo (che è imho l'unico modo corretto, odio MySQL cercando di indovinare ciò che vuoi ed esegui queste query errate invece di lanciare un errore). – wimvds

2

È possibile farlo con un self-join:

select distinct t1.id from t as t1 inner join t as t2 
on t1.col1=t2.col1 and t1.col2=t2.col2 and t1.id<>t2.id 

il t1.id<>t2.id è necessario per evitare gli ID corrispondenti contro se stessi. (Se si desidera solo 1 riga per ogni set di duplicati, è possibile utilizzare t1.id<t2.id).

+0

No, quello restituirà solo 1 riga con i 2 record corrispondenti, non le 2 righe che deve restituire ... – wimvds

+0

@wimvds true, se si desidera tutte le righe duplicate (anziché 1 riga di ogni set duplicato, dovresti usare <>) –

Problemi correlati