Eintrag-Details: Duplikate in MySQL finden und entfernen

02.02.2006

Duplikate in MySQL finden und entfernen

MySQL ab Version 4.0


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();
?>

Code herunterladen

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.

MySQL ab 4.1

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();
?>

Code herunterladen

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";

Code herunterladen

Seiten: 1 2 3 4

Permalink 02.02.2006 11:26:00, von Marian Email , 190 Wörter, 48284 mal angeschaut   German (DE) Kategorien: MySQL

Blogger-Profil

Werbung

Online-Kurse

  • Bequem PHP lernen bei freier Zeiteinteilung von zuhause
  • Der Onlinekurs den jeder versteht
  • www.lernpilot.de/wbt/

Konnte ich helfen?

mehr Werbung