Zur Startseite
Advertisement/Werbung
In Version 4.0 hat MySQL die Möglichkeit eingeführt, das Löschen auch über mehrere Tabelle zu ermöglichen. Um jedoch die mehrfachen Daten zu ermitteln, ist dann zunächst eine temporäre Tabelle notwendig, in der die zu löschenden Daten zwischengespeichert werden:
<?php // bei MySQL ab Version 4.0 $sql = "create temporary table doppel select count(*) as counter, min(id) as id, name, anschrift, plz, ort from adressen group by name, anschrift, plz, ort having counter > 1"; mysql_query($sql); echo mysql_error(); $sql = "delete adressen from adressen, doppel where adressen.name = doppel.name and adressen.anschrift = doppel.anschrift and adressen.plz = doppel.plz and adressen.ort = doppel.ort and adressen.id != doppel.id"; echo "sql: $sql<br>"; mysql_query($sql); echo mysql_error(); ?>
Die SELECT-Anweisung zur Erzeugung der temporären Tabelle "doppel" ist mit der schon beschriebenen Anweisung identisch. Im zweiten Schritt, wird die DELETE-Anweisung so ausgeführt, dass direkt mit den Feldern aus der temporären Tabelle verglichen wird. Version 4.0 kann hier noch keine Tabellen-Aliase verwenden, so dass die Tabellennamen ausgeschrieben werden müssen.
Richtig komfortabel wird die Sache erst ab MySQL 4.1. Hier kann die Abfrage für die temporäre Tabelle einfach direkt in die Anweisung eingesetzt werden:
<?php // Ab Version 4.1 $sql = "delete adressen from adressen, (select count(*) as counter, min(id) as id, name, anschrift, plz, ort from adressen group by name, anschrift, plz, ort having counter > 1) as doppel where adressen.name = doppel.name and adressen.anschrift = doppel.anschrift and adressen.plz = doppel.plz and adressen.ort = doppel.ort and adressen.id != doppel.id"; mysql_query($sql); echo mysql_error(); ?>
Hier kann jetzt auch der jeweilige Tabellen-Alias verwendet werden, um die Anweisung kürzer zu schreiben:
$sql = "delete a from adressen a, (select count(*) as counter, min(id) as id, name, anschrift, plz, ort from adressen group by name, anschrift, plz, ort having counter > 1) as d where a.name = d.name and a.anschrift = d.anschrift and a.plz = d.plz and a.ort = d.ort and a.id != d.id";
