Mit einer SQL-Abfrage können doppelte Einträge, auch Dubletten genannt, sehr schnell und einfach innerhalb einer Tabelle identifiziert werden. Dazu dient die folgende Tabelle mit dem Namen „Liste“ als Vorlage:
id | vorname | name |
---|---|---|
1 | Max | Mustermann |
2 | Maria | Müller |
3 | Olaf | Heinz |
4 | Peter | Schuster |
5 | Karl | Richter |
6 | Wilhelm | Bach |
7 | Maxi | Mustermann |
8 | Max | Mustermann |
Zu erkennen ist ein doppelter Eintrag mit der ID 1 und 8. Der Datensatz mit der Nr. 7 hat zwar den gleichen Nachnamen, jedoch einen unterschiedlichen Vornamen. Daher darf dieser Eintrag nicht als Duplikat erkannt werden.
Mit der folgenden Abfrage werden alle vorkommenden Duplikate aufgelistet und ihre Anzahl an Vorkommen gezählt:
SELECT vorname, name, COUNT(id) AS cnt
FROM liste
GROUP BY vorname,name
HAVING cnt > 1
Es fehlt hierbei jedoch noch eine genauere Ausgabe, welche Datensätze genau als Duplikate erkannt wurden. Es soll möglich sein, alle doppelten Datensätze einzeln aufzulisten. Dies erfolgt über ein Inner Join auf die gleiche Datenbanktabelle:
SELECT liste.vorname, liste.name
FROM liste
INNER JOIN (
SELECT vorname,name
FROM liste
GROUP BY vorname,name
HAVING COUNT(id) > 1) dup ON liste.name = dup.name && liste.vorname = dup.vorname
Vielen Dank für dieses hilfreiche Beispiel. Könntest Du noch veröffentlichen, wie man an die ids aller Duplikate kommt?
Mit gelingt bisher lediglich
echo ‚Es gibt mehrere Einträge mit dem Namen: ‚ . $zeile->name . ‚ und dem Vornamen: ‚ . $zeile->vorname . ‚ , z.B. ID: ‚ . $zeile->id. „“;
, aber ich würde gerne alle IDs ausgeben.
Hallo Rainer,
damit in deiner Abfrage zusätzlich die ID mit ausgegeben werden kann, erweitere das äußere SELECT um das Feld liste.id. Die erste Zeile lautet daraufhin:
SELECT liste.id, liste.vorname, liste.name
…
zuerst mal danke für die Hilfestellung. Ich habe ein ähnliches Problem, bei dem ich in einer Ahnenliste die Doubletten von Personen mit gleichem Geburtsdatum finden möchte. Ich habe den Code entsprechend geändert, aber ich weiß nicht, wie ich Personen mit leeren Geburtseinträgen nicht ausklammern kann.
Modifizierter Code:
SELECT tng_people.personid, tng_people.lastname, tng_people.firstname, tng_people.birthdate
FROM tng_people
INNER JOIN (
SELECT firstname,lastname,birthdate
FROM tng_people
GROUP BY firstname,lastname,birthdate
HAVING COUNT(personid) > 1) dup ON
tng_people.lastname = dup.lastname &&
tng_people.firstname = dup.firstname &&
tng_people.birthdate=dup.birthdate
Hallo Charly,
damit Einträge ohne Geburtsdatum in der Ausschlussliste erscheinen, kannst du am Ende noch die folgende Zeile hinzufügen:
OR tng_people.birthdate IS null
Hallo Thomas, hat zwar eine Zeit gedauert, aber der Tipp war gut. Danke.
DANKE, das hat mir sehr geholfen, doppelte Einträge zu finden!