mySQL: aus mehreen Tabellen löschen
AllesMeins
- datenbank
0 Götz0 Ilja0 Ilja0 AllesMeins0 Ilja
Hiho,
nachdem meine ursprüngliche Frage ja inzwischen ins Archiv gewandert ist versuche ich jetzt nochmal einen Anlauf (vielleicht habe ich dieses mal ja ein besseres Händchen beim formulieren). Ich stehe vor folgendem Problem: Ich bastele an einem kleinen Online-Karten-Spiel. Dabei sind in einer Tabelle alle Karten mit ID und Besitzer verzeichnet. In einer zweiten Tabelle stehen die Eigenschaften der entsprechenden Karte (entweder gar keine Eigenschaft oder mehrere). Die Aufgabe ist es nun mehrere Karten von einem Besitzer inklusive aller dazu gehörigen Eigenschaften-Einträge zu löschen.
Nun habe ich (mit Hilfe des Forums) folgenden Query zusammengebastelt:
DELETE
karten, karten_eigen
FROM
karten, karten_eigen
WHERE
karten.ID = karten_eigen.karte AND karten.besitzer = "XYZ"
Das funktioniert soweit auch sehr gut solange es einen oder mehrere Eigenschaften zu der Karte gibt. Gibt es aber keinen dazugehörigen Eigenschaften-Eintrag wird auch in der Tabelle 'karten' nichts gelöscht. Ein kleines zusätzliches Problem ist, dass ich mit mySQL 4.0.16 auskommen muss.
Kann mir irgendwer helfen den query zu verbessern?
Grüsse
Marc
Hallo Marc!
DELETE karten, karten_eigen FROM karten, karten_eigen WHERE karten.ID = karten_eigen.karte AND karten.besitzer = "XYZ"
Das funktioniert soweit auch sehr gut solange es einen oder mehrere Eigenschaften zu der Karte gibt. Gibt es aber keinen dazugehörigen Eigenschaften-Eintrag wird auch in der Tabelle 'karten' nichts gelöscht.
Kann mir irgendwer helfen den query zu verbessern?
Also, daß ohne Eigenschaft nichts gelöscht wird ist klar, weil Deine Bedingung dann ja auf keinen Datensatz zutrifft.
Vielleicht ist es doch besser, es mit zwei getrennten Queries direkt hintereinander zu machen, dann hättest Du zumindest das Problem wohl nicht mehr.
MfG
Götz
Hiho,
Vielleicht ist es doch besser, es mit zwei getrennten Queries direkt hintereinander zu machen, dann hättest Du zumindest das Problem wohl nicht mehr.
Jo, das ist meine Notlösung wenn gar nichts mehr hilft :) Aber ich bin ja auch immer daran interresiert meine Kentnisse zu erweitern und würde es gerne erst mal die elegante Lösung mit einem Query nutzen (sofern es denn eine gibt)
Grüsse
Marc
yo,
DELETE
karten, karten_eigen
FROM
karten, karten_eigen
WHERE
karten.ID = karten_eigen.karte AND karten.besitzer = "XYZ"
estetze ds AND durch ein OR...
WHERE karten.ID = karten_eigen.karte OR karten.besitzer = "XYZ"
Ilja
yo,
ich muss mich selbst korregieren, da ich in meiner vorschnellen antwort nicht bedacht habe, das ein Join der beiden tabellen gebildet wird. das OR hätte dabei fatale folgen.... ;-)
dann sieht die lösung fast so aus, wie du es geschrieben hast, nur würde ich anstelle des INNER JOINS einen LEFT JOIN verwenden.
DELETE FROM karten LEFT JOIN karten_eigen ON (karten.ID = karten_eigen.karte)
WHERE karten.besitzer = "XYZ"
ich hoffe, so geht es.
Ilja
Hiho,
ich weiss das das fatale Folgen hast, habe es auch schon ausprobiert :)
Das Problem ist hier leider das JOINS laut Manual erst ab 4.0.20 gehen (korrigiert mich bitte wenn ich mich irre - habe es schon ausprobiert, kan natürlich sein das ich da irgendwo einen anderen Fehler reingebaut habe), ich aber mit .16 auskommen muss.
Marc
yo,
ich weiss das das fatale Folgen hast, habe es auch schon ausprobiert :)
ja, da habe ich erst geschrieben und dann nachgedacht....
Das Problem ist hier leider das JOINS laut Manual erst ab 4.0.20 gehen (korrigiert mich bitte wenn ich mich irre - habe es schon ausprobiert, kan natürlich sein das ich da irgendwo einen anderen Fehler reingebaut habe), ich aber mit .16 auskommen muss.
wenn ich das richtig verstanden habe, dann wird multiple delete seit version 4.0.0 unterstützt. ab 4.0.2 wird auch eine andere schreibweise mit USING unterstützt. aber der Join sollte auch mit der "ersten" schreibweise ab 4.0.0 funktionieren. versuch mal den LEFT join entsprechend der 4.0.0 syntax anzupassen und ihn auszuführen. vielleicht klappt es ja.
Ilja
Hiho,
Leider nicht:
You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'LEFT JOIN karten_eigen ON (karten.ID = kar
Grüsse
Marc