MudGuard: doppelte Einträge löschen

Beitrag lesen

Hi,

$query = "SELECT id FROM Tabelle WHERE 1";

Wozu das WHERE 1? Auch ohne WHERE 1 werden alle Datensätze ausgewählt.

$result = mysql_query($query);

$result enthält jetzt alle Datensätze.
Bsp: die Tabelle enthält Datensätze mit den IDs 1, 2, 3.

while($row = mysql_fetch_object($result))
{
$query = "DELETE FROM Tabelle WHERE ((id != '$row->id')";

1. Schleifendurchlauf, id = 1.
Es werden die Datensätze mit den ids 2 und 3 gelöscht.

2. Schleifendurchlauf, id = 2.
Es wird der Datensatz mit der id 1 gelöscht (die anderen sind ja schon weg).

3. Schleifendurchlauf, id = 3.
Es wird kein Datensatz gelöscht, da bereits nach dem zweiten Durchlauf alle Datensätze gelöscht wurden.

mysql_query($query) or die(mysql_error());
}
Hiermit wurde die Tabelle geleert.

Ähnliches passiert bei komplizierterer Bedingung (alle Spalten identisch außer der id).
Annahme: die Datensätze 1 und 3 sind identisch (bis auf die id).

1. Schleifendurchgang: id = 1.
Es wird der Datensatz mit der id 3 in der Datenbank als identisch zu Datensatz 1 aus dem $result gefunden und gelöscht.

2. Schleifendurchgang, id = 2.
Es wird kein Duplikat gefunden, also nichts gelöscht.

3. Schleifendurchgang: id = 3.
Es wird der Datensatz mit der id 1 in der Datenbank als identisch zu Datensatz 3 aus dem $result (der in der Datenbank schon nicht mehr existiert) gefunden und gelöscht.

Es bleibt Datensatz 2 übrig.

Mein Vorschlag:
Laß Dir anfangs die Datensätze sortiert aufsteigend nach der ID ausgeben.
Dann löschst Du nicht alle Datensätze mit id ungleich row->id, sondern nur die mit id größer row->id.
Damit sollte von allen Mehrfach-Datensätzen der mit der niedrigsten id übrigbleiben.

Normalerweise sollte aber bereits beim Eintragen der Daten verhindert werden, daß es zu Doubletten kommt.

cu,
Andreas

--
Warum nennt sich Andreas hier MudGuard?
Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.