2010-05-21 18 views
6

Ich habe eine Tabelle wie dieseGet Liste von doppelten Zeilen in MySql

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

ich eine Abfrage benötigen, die alle Felder zurück (select *) aus den Datensatz, die den gleichen nachnamen und vornamen (in diesen haben Fall, Datensätze 1 und 2). Kann mir jemand dabei helfen? Dank

Antwort

13

Die folgende Abfrage wird die Liste der Duplikate geben:

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 Die Daten, die Sie scheint geschrieben zu sein falsch „Doe“ und „Knight“ sind ein Nachname, kein Vorname: p.

+2

Ich musste nur Select distinct hinzufügen (die Abfrage wurde 2 mal die gleiche Zeile zurückgegeben). Danke für Ihre Hilfe – user347033

11

Die allgemeine Lösung für Ihr Problem ist eine Abfrage der Form

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

Dies wird eine Zeile für jeden Satz doppelter Zeile in der Tabelle zurück. Die letzte Spalte in diesem Ergebnis ist die Anzahl der Duplikate für die bestimmten Werte.


Wenn Sie wirklich die ID wollen, so etwas wie dies versuchen:

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 

getestet haben es allerdings nicht

+0

Dies würde nicht wirklich alle Zeilen zurückgeben, es würde nur die doppelten Zeilen finden. – jle

+0

Das ist viel zu teuer, Sie können es mit einem einfachen Join lösen (siehe meine Antwort: 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 

Diese alle Spalten aus der Tabelle zurückgeben soll, wo Es gibt doppelten Nachname und Vornamen. Ich empfehle, * zu den genauen Spalten zu ändern, die Sie benötigen.

Bearbeiten: Ich fügte ein Maximum (ID), so dass die Gruppe von kein Problem sein würde. Meine Anfrage ist nicht so elegant, wie ich es möchte. Es gibt wahrscheinlich einen einfacheren Weg, es zu tun.

+0

Hmm ... ich sehe was du jetzt meinst. Aber ich bin mir ziemlich sicher, dass deine Anfrage falsch ist. Sie können die ID nicht zurückgeben, wenn Sie sie nicht zur Gruppierung nach verwenden. – ewernli

+0

Dieser Join funktioniert nicht - es gibt keine ID-Spalte in der t2-Abfrage. –

+0

Das ist nur eklatant falsch ... Die Gruppe von wird in der Tat alle Duplikate eliminieren, die du hast, wenn du MySQL verwendest, da du nur nachname und vorname gruppierst, also gibt es 1 Zeile mit 1 ID statt aller Unterscheidungszeichen Reihen, wie Sie wahrscheinlich erwartet haben (versuchen Sie es einfach, Sie werden sehen). Oh, und jedes andere RDBMS würde sich über Ihre Gruppe beschweren (was imho der einzig richtige Weg ist, ich hasse es, dass MySQL versucht zu erraten, was Sie wollen und diese irrenden Abfragen ausführen, anstatt einen Fehler zu werfen). – wimvds

2

Sie können es mit einem tun Selbst-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 

die t1.id<>t2.id notwendig ist ids gegen sich selbst passend zu vermeiden. (Wenn Sie nur eine Zeile aus jedem Satz von Duplikaten haben möchten, können Sie t1.id<t2.id verwenden).

+0

Nein, das wird nur 1 Zeile mit den 2 übereinstimmenden Datensätzen zurückgeben, nicht die 2 Zeilen, die es zurückgeben soll ... – wimvds

+0

@wimvds true, wenn Sie alle Duplikatsätze wollen (statt 1 Zeile jedes Duplikatsatzes, Sie sollten verwenden <>) –

Verwandte Themen