Höheres MySQL und Komplexität in DELETE-Befehl?



  • Hallo,

    Folgendes sollte funktionieren:

    DELETE FROM Table WHERE id = 'idORparentid=id' OR parentid = 'id'

    Jetzt soll es aber komplexer sein:

    Entweder soll die id übereinstimmen ODER
    die parentid soll übereinstimmen ODER
    jemand der die parentid von dem hat, der die parentid hat

    Also so sieht es aus:

    id=1 parentid IS NULL
    id=2 parentid = 1
    id=3 parentid = 2

    Und jetzt soll id = 2 mitgelöscht werden.
    Ein weiteres problem, das auftreteten könnte, ist hierbei natürlich, dass wenn id=2 zuerst gelöscht wird, nichts mehr gelöscht werden kann, was zu id=2 gehört!

    Kann ich das mit einem DELETE Befehl umsetzen?

    MfG MAV



  • Ich denke, da wirst du mehrere DELETEs brauchen 🙄
    Du kannst das ganze dann entweder rekurisv machen, dann darf es beliebig viele Ebenen geben, oder du machst zuerst ein SELECT, um die zu löschenden Zeilen auszulesen:

    SELECT t1.id FROM table AS t1 LEFT JOIN table AS t2 ON t1.parent_id = t2.id WHERE t1.id = '$id' OR t1.parent_id = '$id' OR t2.id = '$id' OR t2.parent_id = '$id'
    

    Ab MySQL 4.1 könntest du evtl auch sowas machen:

    DELETE FROM table WHERE id IN (SELECT t1.id FROM table AS t1 LEFT JOIN table AS t2 ON t1.parent_id = t2.id WHERE t1.id = '$id' OR t1.parent_id = '$id' OR t2.id = '$id' OR t2.parent_id = '$id')
    


  • Hallo,

    also erst einmal danke für die Antwort.

    Leider verstehe ich von dem Code wieder einmal nix, also unbekannte Schlüsselworte:

    xxx. (kein Schlüsselwort 🙄)
    AS
    ON
    LEFT JOIN
    JOIN

    Naja und ich wäre auch dankbar, wenn ein einfaches Anwendungsbeispiel gezeigt werden könnte. 🙂

    MfG MAV 🙂



  • http://www.mysql.de/doc/de/JOIN.html

    Evtl. hilft das schon, meiner Meinung nach verständlich 😃



  • Mit AS kannst du einen Namen angeben, über den du die Tabelle ansprechen kannst (hier um eine Tabelle mit sich selbst zu verknüpfen - dafür der LEFT JOIN)
    Für AS noch ein weiteres kleines Beispiel: Wenn du z.B. schreibst "SELECT COUNT() FROM ..." heißt die Spalte ja nachher COUNT() - schreibst du aber "SELECT COUNT(*) AS anzahl FROM ..." so heißt die Spalte nachher eben anzahl (was beim Einlesen in ein assoziatives Array dann deutlich schöner ist 😉 )



  • Danke. 🙂

    Aber mal eine allgemeine Frage:

    Wie kann ich eine Lösung zu einem Problem finden, bei dem ich nicht weiß, was man in der Lösung verwendet?
    JOIN... darauf wäre ich nie im Leben gekommen!

    MfG MAV



  • In dem man in der Doku stöbert und sich z.B. mal die Syntax zu SELECT anschaut 🙄



  • hum, aber webnn ich vorher net wuste, dass sowas in select vorkommt? 😛



  • Du schaust einfach mal nach, was du mit den Befehlen, die du eh schon nutzt (SELECT, DELETE, INSERT, UPDATE, ...) so alles machen kannst - liest dabei die Querverweise usw. 😉



  • Das nennt man dann "Wissen ansammeln"
    Irgendwann weiß man es.

    Wenn du nicht wüsstest wie man eine Schleife macht könntest du auch keine Schleife programmieren.

    Es hat dir mal einer gesagt und nun weißt du es. Wenn man mit SQL etwas machen muss dann muss man sich auch den SQL Syntax ansehen.



  • Hm, das klingt kompliziert, villeicht weiß ich es irgendwann mal. ^^


Log in to reply