Zur Startseite Eine häufig gestellte Frage: Wie kann ich doppelte Datensätze in MySQL finden und entfernen? Die Antwort auf diese Frage ist abhängig von der verwendeten Version von MySQL.
Am elegantesten ist diese Aufgabe mit der Version ab 4.1 zu lösen, aber auch mit älteren Versionen ist eine Lösung möglich. Vor Version 4.0 muss dazu allerdings ein Skript bemüht werden.
Zunächst soll eine Beispiel-Tabelle mit einigen Beispiel-Datensätzen erstellt werden. Dazu wird erst einmal folgende Adress-Tabelle erzeugt:
Advertisement/Werbung
Anmerkung: Die hier vorgestellten Tabellen-Definitionen und Abfragen sollen lediglich das Prinzip verdeutlichen. Bei einigen Einzelheiten würde man in einer endgültigen Anwendung möglicherweise anders vorgehen. Sie dienen hier lediglich als Beispiele, damit das Verfahren anschaulich erläutert werden kann. In meinen Online-Kursen wird selbstverständlich genauer auf Einzelheiten eingegangen.
<?php
mysql_connect("localhost", "root");
mysql_select_db("test");
$sql = "drop table if exists adressen";
mysql_query($sql);
echo mysql_error();
$sql = "create table adressen (
id int primary key auto_increment,
name varchar(255) not null,
anschrift varchar(255) not null,
plz char(5) not null,
ort varchar(255) not null)";
mysql_query($sql);
echo mysql_error();
echo "Adresstabelle wurde angelegt<br>";
?>
Die Tabelle besteht aus einer eindeutigen ID, den Textfeldern Name, Anschrift, PLZ und Ort. Es sollen im nächsten Schritt auch gleich Daten eingefügt werden, die dann schon doppelte oder dreifache Datensätze enthalten. Bei diesen Daten sind natürlich nur die Anschriftsdaten doppelt, die eindeutige ID (die normalerweise automatisch erzeugt wird) ist immer unterschiedlich:
<?php $sql = "insert into adressen (id, name, anschrift, plz, ort) VALUES (1, 'Heinz Meier', 'Hauptstr. 5', '12345', 'Testort1'), (2, 'Fritz Müller', 'Webergasse 3', '23456', 'Testort2'), (3, 'Bert Schmidt', 'Bahnhofstr. 4', '45678', 'Testort3'), (4, 'Heinz Meier', 'Hauptstr. 5', '12345', 'Testort1'), (5, 'Fritz Müller', 'Webergasse 3', '23456', 'Testort2'), (6, 'Heinz Meier', 'Hauptstr. 38', '12345', 'Testort1'), (7, 'Fritz Müller', 'Webergasse 3', '23456', 'Testort2')"; mysql_query($sql); echo mysql_error(); echo "Adressen wurden eingefügt<br>"; ?>
DESCRIBE dubletten_bereinigt;
+---------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| Anrede | varchar(255) | NO | MUL | NULL | |
| Titel | varchar(255) | NO | | NULL | |
| Vorname | varchar(255) | NO | | NULL | |
| Name | varchar(255) | NO | | NULL | |
| Zusatz1 | varchar(255) | NO | | NULL | |
| Zusatz2 | varchar(255) | NO | | NULL | |
| Strasse | varchar(255) | NO | | NULL | |
| PLZ | int(5) | NO | MUL | 0 | |
| Ort | varchar(255) | NO | | NULL | |
+---------+--------------+------+-----+---------+----------------+
SELECT COUNT(*) AS anzahl,
MIN(id) AS id,
Vorname, Name, Strasse, PLZ, Ort
FROM dubletten_bereinigt
GROUP BY Name, Ort
HAVING anzahl > 1;
INSERT INTO dubletten_bereinigt (Anrede, Titel, Vorname, Name, Zusatz1, Zusatz2, Strasse, PLZ, Ort)
SELECT DISTINCT Anrede, Titel, Vorname, Name, Zusatz1, Zusatz2, Strasse, PLZ, Ort FROM dubletten_test;