Einzelnen Beitrag anzeigen
  #8  
Alt 16.06.2005, 10:17:44
diver-network diver-network ist offline
Junior Member
 
Registriert seit: Apr 2003
Ort: TÜ
Beiträge: 337
AW: Dubletten Prüfung dauert zu lange.

Hi zusammen,

zum finden von doppelten Einträgen in einer Tabelle hatte ich noch einmal eine Anfrage in der Newsgroup mailing.database.mysql gestartet ("Best way for finding duplicate entries in table?" vom 1.Juni 2005).
Anbei die von mir übersetzte Antwort DES MySQL Spezialisten (meine Meinung) der Newsgruppe, Bill Karwin.
Ihm gebührt der Dank für diese Lösung.

Liste der Einträge, die mehrfach in der Tabelle auftauchen.

SELECT t2.`field`
FROM `table` AS t2
GROUP BY t2.`field`
HAVING COUNT(t2.`field`) > 1;

Liste der IDs von Einträgen, die mehrfach in der Tabelle auftauchen.

SELECT t.id
FROM `table` AS t
WHERE t.`field` IN (
SELECT t2.`field`
FROM `table` AS t2
GROUP BY t2.`field`
HAVING COUNT(t2.`field`) > 1);

Liste der jeweils kleinesten ID von Einträgen, die in einer Tabelle vorkommen.

SELECT MIN(t3.id)
FROM `table` AS t3
GROUP BY t3.`field`;

Alles zusammen gesetzt sollte unten stehendes Statement alle Datensätze löschen,
die mehr als einmal in einer Tabelle vorkommen.
Hierbei wird der Eintrag mit der kleinsten ID nicht gelöscht.

DELETE FROM `table`
WHERE id IN (
SELECT t.id
FROM `table` AS t
WHERE t.`field` IN (
SELECT t2.`field`
FROM `table` AS t2
GROUP BY t2.`field`
HAVING COUNT(t2.`field`) > 1))
AND id NOT IN (
SELECT MIN(t3.id)
FROM `table` AS t3
GROUP BY t3.`field`);

Sollte der Eintrag mit der größten ID des Feldes stehen bleiben so ist das Statement MIN(t3.id) in MAX(t3.id) zu ändern.

Um ohne SUB- SELECTS automatisch doppelte Einträge zu löschen kommt man um einige Handarbeit leider nicht rum, man kann aber sicherlich einiges von oben wieder verwerten und z.B. Zwischenergebnisse entweder in eine Temporäre Tabelle einfügen oder aber in eine Datei ausgeben (Stichwort SELECT INTO OUTFILE), die man dann mit einem Texteditor anpassen kann.

HTH,

Andy
Mit Zitat antworten