PDA

Vollstndige Version anzeigen : doppelte daten suchen und dann lschen


zorromaus
29-10-2004, 12:16
folgendes problem habe ich:

in einer datenbank mit mehreren tausend datenstzen gibt es massenhaft doppelte eintrge (eMail-adressen) jetzt suche ich nach einer suchroutine und will dann die doppelten datenstze lschen bzw. ausfiltern.
ich habe schon berlegt mir z.b. den 1. datensatz vorzunehmen und dann mit den anderen datenstzen zu vergleichen,
dann den 2. datensatz, den 3. datensatz usw......
jetzt stelle ich aber fast das dieses schema ja ne halbe ewigkeit dauert. hat jemand einen besseren und vor allem schnelleren ansatzpunkt wie ich die doppelten datenstze herausfiltere?

danke Z

Ares
29-10-2004, 14:00
Mir fllt auf die schnelle nur eine Lsung ein.
Leg dir eine neue Tabelle an mit den Felder die du brauchst.

Dann machst du folgendes:

INSERT INTO table_new (field1,field2...) SELECT DISTINCT field_a,... FROM table_old;

Ein SELECT DISTINCT liefert nur die eintrge, die eindeutig sind, das heit wenn 100 mal "hallo" vorkommt listet er das nur einmal auf.

Bedenke aber das beim Select keine ID mit selectieren kannst, da du dann immer unterschiedliche zeilen hast.

Beispiel:
1,"hallo"
2,"hallo"

wird nicht zusammengefasst.

Du kannst ja erstmal einen SELECT DISTINCT auf deine Tabelle anwenden um zu schauen was rauskommt beim selektieren.

Eleganter ginge es mit subselect, aber mysql untersttzt sowas imho nicht.

MfG
Ares

diver-network
29-10-2004, 14:05
Hi,

mal aus dem Kopf raus, sprich unbedingt mit Testdaten testen, bevor Du es produktiv anwendest:

mit:

SELECT t1.primary-key AS pk1
,t2.primary-key AS pk2
FROM tabelle1 AS t1 INNER JOIN tabelle1 AS t2 ON t1.email = t2.email
WHERE t1.primary-key < t2.primary-key // WICHTIG, sonst Kreuzprodukt aus allen Inhalten und quasi Endlosschleife!


bekommst Du die ids der doppelten Eintrge raus. Diese stehen in pk1, pk2 dient der stichpunktartigen manuellen Kontrolle der Eintrge, kann aber auch weggelassen werden.
Die IDs liesst Du Dir am besten aus und machst anschliessend einen DELETE FROM tabelle1 WHERE primary-key IN (...).

WICHTIG: Die JOIN- Bedingung muss natrlich ber alle Felder gehen, die identisch sein mssen, damit ein Eintrag als doppelt gilt! Ansonsten schmeisst Du Dir z.B. den Eintrag "meier, [email protected]" raus, obwohl unter der gleichen Email- Adresse noch der Eintrag "mller, [email protected]" steht!!


ACHTUNG: MySQL unterscheidet nicht (immer?) zwischen GROSS- und kleinschreibung. Sprich: "a" und "A" werden beim Vergleich mit "=" als identisch behandelt. Achtet hier unbedingt drauf!


HTH,

Andy

P.S.: Doppelte Eintrge kannst Du natrlich auch mit UNION bekommen, geht aber nicht in allen Versionen von MySQL.
P.S.S.: Achte darauf, da Du fr obige Abfrage auf die JOIN- Felder einen Index setzt, wenn es sehr viele Datenstze zum kontrollieren gibt, sonst kann es dauern.

zorromaus
02-11-2004, 10:23
danke schn das hat mir schon mal geholfen.


gru Z

p.s. das mit den testdaten habe ich ntrlich gemacht. danke