AllesMeins: mySQL: aus mehreen Tabellen löschen

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

  1. 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

    --
    Losung für Freitag, 4. Februar 2005
    Die Elenden werden wieder Freude haben am Herrn, und die Ärmsten unter den Menschen werden fröhlich sein in dem Heiligen Israels. (Jesaja 29,19)
    Jesus hob seine Augen auf über seine Jünger und sprach: Selig seid ihr Armen; denn das Reich Gottes ist euer. (Lukas 6,20)
    (Losungslink)
    1. 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

  2. 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

    1. 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

      1. 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

        1. 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

          1. 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