MySQL: Doppelte Einträge löschen

maga147

Erfahrenes Mitglied
Hallo,

ich hab eine Datenbank nach dem Prinzip

Primärschlüssel, Fremdschlüssel 1, Fremdschlüssel 2
(id, id1, id2)

Aufgrund eines Scriptes, wird und wurde mir immer wieder einträge "doppelt" gespeichert. Das heißt im konkreten:

1 | 1 | 1
2 | 1 | 1
3 | 1 | 1
4 | 2 | 1
5 | 2 | 2
6 | 2 | 2
usw...

mir gehts jetzt aus Perfomance gründen darum diese doppelten (laut Beispiel die IDs 2,3,6) zu finden und zu löschen....

Mir fehlts dabei aber im moment am lösungsansatz.... Kann das überhaupt mit MySQL realisiert werden oder muss man die Datenssätze mit PHP vorsortieren?

Vielen Dank für eure antworten.
 
Hallo,

ich habe die Spalten a, b, c benannt:

PHP:
SELECT * 
FROM foo2
left join
(

    SELECT Min (a) a, Min (groupie) b
    FROM
    (
    SELECT a, b+c groupie FROM foo2

    )   
    GROUP BY groupie        
) dummy
ON foo2.a = dummy.a
WHERE (dummy.a IS NOT NULL AND  dummy.b IS NOT NULL)
Damit legst du fest welche Einträge wohl nicht gelöscht werden sollen.
Hoffe es hilft Dir.

Viele Grüße
 
Hi,

danke für den Hinweis, hab es jetzt auch geschafft keine Fehlermeldung mehr anzuzeigen. Allerdings wird der SQL Befehl ohne jegliche Auswirkung an die DB gesendet. D.h. es kommt weder die Query nochmal (im PhpMyAdmin) noch irgeindein ergebnis oder dergleichen.....
 
moin maga147,
versuch es so
Code:
 delete from maga147  t1
where  exists (select 'whatever' from maga147 t2
                 where t2.id1 = t1.id1
                 and t2.id2 = t1.id2
                   and t1.pk      > t2.pk);

wobei 1) sich zum Testen ein "select * from " statt des "delete from" empfiehlt
und 2) mit id1/id2 die beiden FK's gemeint sind, die in Kombination zu dem Kunst-PK führen.

Grüße
Biber
 
Hallo Biber,

danke für deinen Beitrag. Ich kann allerdings im moment mit dem Begriff "Kunst-PK" nicht alzu viel anfangen und bekomme die letzte Zeile nicht so hin, dass er mir keinen Fehler ausgibt...
 
Moin maga147,

sorry, wenn ich Dich verwirrt habe...
Ich hatte es so verstanden, dass dieses fehlerhaft zusammengeschrotete Skript, das diesen Datenmüll zu verantworten hat, eigentlich alle relevanten Kombinationen von id1 und id2 als neuen Datensatz in die Tabelle schreiben sollte.
Und dieser neue Datensatz bekommt dann einen künstlichen PrimaryKey (z.B. ein Auto_increment oder so etwas).
Das, was ich pk oder Kunst-Pk genannt habe, ist in Deiner Frage oben das erste "id" in der skizzierten Feldbeschreibung "id, id1, id2".

Sonst poste doch einfach mal ernsthaft, wie Tabelle und Schlüsselfelder heißen.
Dann lässt sich dieses Sender-Empfänger-Problem drastisch verkürzen.
Ich erzähle auch keine Feldnamen weiter...

Grüße
Biber
 
Herzlichen Dank für deine Ausführungen, Biber.

Nachdem ich jetzt auch weis, was ein "PK" ist, konnte ich die Abfrage anpassen und alles hat funktioniert.

Vielen Dank nochmal!
 
Zurück