mysql distinct
dr. doing
- php
1 Hans0 small-step0 Hans
Hallo,
Ich hab grad ein fehler gemacht und zwar habe ich ein script zwei mal ausgeführt und schon sind doppelte einträge in der datenbank!
Ich suche jetzt eine sql-abfrage die ALLE doppelt und dreifach und vierfach... einträge aus der db löscht, so dass, wie vorher, wieder nur ein eintrag drin ist.
ich möchte das ganze nicht auf spalten beziehen, sondern die abfrage soll einfach gucken wo sind komplett identische tupel? -> löschen
mit komplett meine ich alle spalten bis auf ID, denn die ist immer anders ;D
vielen dank für eure hilfe
Hallo Mr. better_not_doing, *SCNR*
1.) create table rettung as select * from doppelte_eintrag_tabelle where 1=0;
2.) alter table rettung nologging;
3.) insert into rettung (ID, spalte1, spalte2) select id, spalte1, spalte2 from doppelte_eintrag_tabelle where id in (select id from (select min(id) as id, spalte1, spalte2 from doppelte_eintrag_tabelle group by spalte1, spalte2));
4.) commit;
5.) alter table doppelte_eintrag_tabelle nologging;
6.) delete from doppelte_eintrag_tabelle;
7.) drop table doppelte_eintrag_tabelle
8.) create table doppelte_eintrag_tabelle as select * from rettung; /* Achtung: kein "where 1=0" !!!
9.) commit;
10.) delete from rettung;
11.) drop table rettung;
zu 3.)
Du mußt ja ein Kriterium haben, ab dem eine Zeile eindeutig ist (die ID ausgenommen). Dann holst Du Dir die kleinste ID aus diesem Block gleicher Zeilen (da ja bei Dir auch doppelte Zeilen unterschiedliche ID's haben). Um an das Minimum (oder Max) zu kommen, mußt Du einen Bock bilden, innerhalb dessen das Extrema gebildet wird. Dies machst Du bei group by. Da bei Oracle dummerweise das group by auf alle Spalten des selects gehen, muß man halt hier alle Spalten angeben, vielleicht ist das bei mysql anders.
Sprich:
ID Spalte1 Spalte2
1 Hallo Hans
2 Hallo Hans
3 Hallo Hans
Ergebnis obiger Abfrage:
min(ID) Spalte1 Spalte2
1 Hallo Hans
Ich hoffe, ich habe jetzt nicht noch mehr Verwirrung gestiftet :-)
Falls Du Dir nicht sicher bist, das Statement aus 3.) Händisch ohne insert ausprobieren und dran rumfeilen, bis es bei Dir paßt und Du verstehst, was Du machst.
Gruß
Hans
Hallo Hans,
schöne Lösung, Respekt. Degenfechter, was? Ich hätte es wahrscheinlich umständlich und Holzfällermäßig über PHP gemacht und dafür drei Stunden gebraucht :-)
Gruß,
small-step
Hallo small-step,
danke, danke. Wenn Du dich jahrelang mit ORACLE-SQL und -PL/SQL-Programmierung und external Procedures zusammen mit webDB rumschlägst und zig Applikationen geschrieben hast, dann kannst Du das auch ;-)
Gruß
Hans
Hallo Hans,
schöne Lösung, Respekt. Degenfechter, was? Ich hätte es wahrscheinlich umständlich und Holzfällermäßig über PHP gemacht und dafür drei Stunden gebraucht :-)
Gruß,
small-step