Doppelte Einträge in mySQL Tabelle finden

on

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

 

5 thoughts on “Doppelte Einträge in mySQL Tabelle finden

  1. 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.

    1. 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

      1. 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

        1. 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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.