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.