Janine: DELETE Anweisung für Kinder

Moin!

DELETE FROM _menueWHEREid = 10

wie kann ich die Kinder gleich mitlöschen lassen?

es gibt ein Datenbankfeld Namens hid und uid

1. wenn id = hid ist und uid = 0 soll er noch alle Datensätze löschen, wo hid sagen wir mal 10 ist

2. wenn hid = uid ist soll er noch alle löschen, wo hid = 10 und uid = 10 ist

kann man das alles in einer SQL-Anweisung schreiben, oder muss ich das mit PHP in 3 Anweisungen aufteilen?

Datenbank: MySQL 4.0.25
PHP: 5.0.4
Apache 1.3.33

danke
cu
Janine :-)

  1. Mir ist nicht ganz klar was du machen willst. Wär vielleicht klarer, wenn du mal die Strucktur der Tabelle zeigen könntest.

    1. Moin!

      Mir ist nicht ganz klar was du machen willst. Wär vielleicht klarer, wenn du mal die Strucktur der Tabelle zeigen könntest.

      +----+-----+-----+---------
      | id | hid | uid |
      +----+-----+-----+---------
      | 1  |  1  |  0  |
      +----+-----+-----+---------
      | 2  |  1  |  1  |
      +----+-----+-----+---------
      | 3  |  1  |  1  |
      +----+-----+-----+---------
      | 4  |  4  |  0  |
      +----+-----+-----+---------
      | 5  |  5  |  0  |
      +----+-----+-----+---------
      | 6  |  5  |  5  |
      +----+-----+-----+---------
      | 7  |  5  |  6  |
      +----+-----+-----+---------

      1, 4 und 5 ist die erste Ebene
      2 und 3 ist die zweite Ebene von 1
      6 ist die zweite Ebene von 5
      7 ist eine Unterebene von 6

      es gibt insgesammt nur 3 Ebenen

      wenn ich 1 lösche, müssen also die ID's 1, 2 und 3 gelöscht werden
      lösche ich 5, müssen 6 und 7 mitgelöscht werden
      lösche ist 6 muss 7 mitgelöscht werden
      lösche ich 7, wird nur 7 gelöscht

      Janine

      1. Hello,

        +----+-----+-----+---------
        | id | hid | uid |
        +----+-----+-----+---------
        | 1  |  1  |  0  |
        +----+-----+-----+---------
        | 2  |  1  |  1  |
        +----+-----+-----+---------
        | 3  |  1  |  1  |
        +----+-----+-----+---------
        | 4  |  4  |  0  |
        +----+-----+-----+---------
        | 5  |  5  |  0  |
        +----+-----+-----+---------
        | 6  |  5  |  5  |
        +----+-----+-----+---------
        | 7  |  5  |  6  |
        +----+-----+-----+---------

        1, 4 und 5 ist die erste Ebene
        2 und 3 ist die zweite Ebene von 1
        6 ist die zweite Ebene von 5
        7 ist eine Unterebene von 6

        Könntest Du nochmal ein paar erklärende Worte verlieren zu den Spaltenbezeichnern?
        Wieso hat die id(7) in hid eine 5 stehen?
        Irgendwie macht das auf mich einen zirkulären Eindruck...

        Harzliche Grüße vom Berg
        esst mehr http://www.harte-harzer.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        1. yo,

          Wieso hat die id(7) in hid eine 5 stehen?

          weil der datensatz 5 die erste ebene für diesen datensatz darstellt, datensatz 6 die zweite ebene und somit datensatz 7 die dritte ebene ist.

          Ilja

          1. Hello,

            Wieso hat die id(7) in hid eine 5 stehen?

            weil der datensatz 5 die erste ebene für diesen datensatz darstellt, datensatz 6 die zweite ebene und somit datensatz 7 die dritte ebene ist.

            Dann ist aber 7 kein Kind von 6 sondern ein Enkel.
            Oder hatte ich da was verkehrt verstanden?

            Ich halte da bei fixiertem Root (also nicht mehr verschieblich) auch für günstiger, jeweils das Parent-Element und die Distanz zu Root anzugeben.

            Harzliche Grüße vom Berg
            esst mehr http://www.harte-harzer.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau
  2. echo $begrüßung;

    DELETE FROM _menueWHEREid = 10

    wie kann ich die Kinder gleich mitlöschen lassen?

    Dafür gibt es für das DELETE-Statement die Multiple-table Syntax.

    echo "$verabschiedung $name";

    1. Moin!

      DELETE FROM _menueWHEREid = 10

      wie kann ich die Kinder gleich mitlöschen lassen?

      Dafür gibt es für das DELETE-Statement die Multiple-table Syntax.

      ich hab mir das durchgelesen, ich verstehe aber nicht ganz, wie ich das im Fall von https://forum.selfhtml.org/?t=113311&m=719077 anwenden muss

      könntest du mir einen kleinen Denkanstoss verpassen? ;-)

      Janine

      1. echo $begrüßung;

        könntest du mir einen kleinen Denkanstoss verpassen? ;-)

        Mit deinen Erläuterungen sieht die Sache ganz anders aus, als ich sie mir vorstellte. Ich habe mir Iljas Tipp nicht ganz genau angesehen, doch seine Ideen/Lösungen sind fast immer die richtigen.

        Ich würde dir auch noch eine andere Lösung für verschachtelte Daten zeigen wollen.
        Solche Vaterzeiger-Hierarchien, wie du sie verwendest, sind dann schnell und einfach, wenn die Tabelle größtenteils im Ganzen gelesen wird. Braucht man Teilstücke, kommt man oft um rekursives Abfragen nicht herum, und das kostet.
        Es gibt da noch das Nested Set-Modell. Das ist etwas aufwändiger zu pflegen, doch Löschanweisungen und andere Abfragen über einzelne Zweige lassen sich eleganter formulieren.
        Mein Favorit zu dem Thema ist grad nicht erreichbar, vielleicht besinnt er sich aber noch irgendwann: http://www.develnet.org/36.html. Ansonsten scheint beim ersten Überschauen dieser Artikel auch recht hilfreich zu sein: http://www.databasejournal.com/news/article.php/3518261, und Google findet auch noch jede Menge.

        echo "$verabschiedung $name";

    2. Hello,

      DELETE FROM \_menue WHERE id = 10

      wie kann ich die Kinder gleich mitlöschen lassen?

      Dafür gibt es für das DELETE-Statement die Multiple-table Syntax.

      Das bezieht sich dann aber auf MySQL.
      Jetzt kann außerdem wieder nicht entdecken, ab welcher Version das funktionieren soll

      Harzliche Grüße vom Berg
      esst mehr http://www.harte-harzer.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
  3. Moin!

    1. wenn hid = uid ist soll er noch alle löschen, wo hid = 10 und uid = 10 ist

    hier hat sich ein Fehler eingeschlichen

    er muss dann alle hid = 10 löschen, wo uid nicht 0 ist

    Janine

  4. yo,

    das datenbank-design ist meiner meinung nach etwas unglücklich gewählt. aber wenn dein schema richtig verstanden habe, dann hat jeder datensatz in hid und uid immer einen direkten bezug zur id. dies kann man sich zu nutze machen und somit wird die abfrage sehr einfach. bin mir aber nicht sicher, ob ich da nicht zu schnell "gedacht" habe. greifen wir mal das beispiel mit der id = 10 auf.

    DELETE FROM _menue
    WHERE id = 10
    OR hid = 10
    OR uid = 10

    Ilja

  5. Moin!

    [Thema...]
    Lass das den Papst oder den Meininger nicht hören... Der lässt doch glatt das Forum auf den Index setzen.

    MFFG (Mit freundlich- friedfertigem Grinsen)

    fastix®

    --
    Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Development. Auch  für seriöse Agenturen.
  6. Hello,

    kann man das alles in einer SQL-Anweisung schreiben, oder muss ich das mit PHP in 3 Anweisungen aufteilen?

    Wenn Du das in mehrere Statements aufteilst, sollten die auf jeden fall gebunden werden.
    Entweder durch ein Common oder wenn die DB das nicht kann, durch ein Lock der Tabellen.
    Anderenfalls sind durch konkurrierende Prozesse Integrigtätsbrüche möglich.

    Harzliche Grüße vom Berg
    esst mehr http://www.harte-harzer.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau