saurier: Nested Sets - nur teilweise aufklappen

Vorab: Mein Problem bezieht sich auf die Erklärung zu den Nested Sets von Arne Klempert:
http://www.klempert.de/nested_sets/

Ich knüpfe dort an, wo er leider aufgehört hat.

Wir haben also folgenden Baum:

  
Säugetiere  
   Primaten  
       Halbaffen  
       Affen  
   Nagetiere  
       Mäuse  

Wie man sieht, habe ich unter "Nagetiere" Das Kind "Mäuse" angehängt.

Das ganze soll ein Menü auf einer Webseite werden wie man sie ja recht häufig im Web sieht.

Leider erklärt Arne nur, wie man den gesamten Baum anzeigt ODER den Pfad zu einem Kind.

Ich brauche sone art Mittelding welches ich hier anhand folgender Grafik verdeutlichen will:

Wir befinden uns gerade auf der "Nagetiere"-Seite.

  
Säugetiere  
   Primaten  
   Nagetiere  
       Mäuse  

Wie unschwer zu erkennen ist, will ich nur den Weg zum aktuellen Ast anzeigen und dessen Kinder (in diesem Fall: Mäuse).

Wenn ich jetzt auf "Nagetiere" wäre, müsste das set folgendermaßen aussehen:

  
Säugetiere  
   Primaten  
       Halbaffen  
       Affen  
   Nagetiere  

Wie muss die Abfrage lauten die Arne leider ausgelassen hat??

LG

  1. Hi!

    Wie unschwer zu erkennen ist, will ich nur den Weg zum aktuellen Ast anzeigen und dessen Kinder (in diesem Fall: Mäuse).

    Betrachte in einem solchen Fall immer die L- und R-Werte der Knoten, die du haben möchtest und diejenigen von denen du sie nicht haben möchtest. Finde dazu die Gesetzmäßigkeit. Für manche Fälle ist es auch noch hilfreich, zur einfacheren Abfrage eine Level-Spalte extra mitzuführen, wobei man das Level aber auch gegen den Aufpreis eines Subselects rausbekommt.

    Wenn du auf Primaten stehst[*] willst du alle Elemente mit L größer dem Primaten-L und R kleiner dem Primaten-R, was die Kinder ergibt. Zudem willst du alle Elemente mit einem Level kleiner oder gleich dem von Primaten.

    Schwieriger wird es bei weiteren Verschachtelungen, denn wenn du da nach dem Level gehst, klappt es auch Neffen und Nichten auf. Wenn du Halbaffen anzeigst, willst du (neben dessen Kindern und den Baum hochzu) nur die Affen und Nagetiere, nicht aber die Unterordnungen der Nagetiere, die ja auf dem gleichen Level sind wie die Halbaffen.

    Säugetiere
       Primaten
           Halbaffen
               Feuchtnasenaffen
               Trockennasenaffen
           Affen
               Neuweltaffen
               Altweltaffen
       Nagetiere
           Hörnchenverwandte
               Brötchen
               Croissant
               Baguette
           Biberverwandte
               ...
           Mäuseverwandte
           Dornschwanzhörnchenverwandte
           Stachelschweinverwandte

    Da fallen mir nur mehrfache Einzelabfragan ein, die mit UNION verbunden werden, wobei dabei gleich Dopplungen rausfallen.

    • alle Kinder der Halbaffen
    • Parent und dessen Level ermitteln
        - alle mit gleichem oder kleinerem Level
        - alle Kinder mit einem Level eins größer als Parent

    Das wird noch komplexer, je weiter runter du im Bum steigst und je weniger niedrigere Level du aufgeklappt darstellen willst. Aber vielleicht hab ich da nur eine Gesetzmäßigkeit übersehen, die das Ganze einfacher macht.

    Leider erklärt Arne nur, wie man den gesamten Baum anzeigt ODER den Pfad zu einem Kind.

    Es gibt auch mindestens ein Tutorial, das mehr Abfragen zeigt, unter anderem auch in Verbindung mit dem Level.

    [*] Schönen Gruß von der Doppeldeutigkeit.

    Lo!

  2. Tach.

    Wie unschwer zu erkennen ist, will ich nur den Weg zum aktuellen Ast anzeigen und dessen Kinder (in diesem Fall: Mäuse).

    Na formuliert hast Du Deine Zielstellung ja bereits völlig korrekt. Du brauchst:

    (1) den aktuellen Knoten,
      (2) den Pfad von der Wurzel zum aktuellen Knoten und
      (3) alle direkten Kinder dieses Pfades

    (1) kann man als gegeben ansehen. (2) ist nichts anderes als die Menge der Knoten, für die knoten.L < aktuellerKnoten.L < knoten.R gilt. (3) ist dann auch wieder recht einfach, nämlich die Menge aller Knoten, deren Elternknoten Bestandteil der Menge (2) ist.

    Die Teilergebnisse kannst Du entweder, wie dedlfix vorschlägt, über UNION verbinden oder über Self Joins der Knotentabelle oder …

    --
    Always remember that you are unique. Just like everybody else.