Nested Sets: Teilbaum komplett aufklappen?

Nested Sets: Teilbaum komplett aufklappen?

am 18.03.2007 22:58:49 von Manuel Reimer

Hallo,

nehmen wir an ich hätte folgenden Baum als Nested Set umgesetzt:

name left right
1 28
root1 2 3
root2 4 13
sub1 5 8
sub11 6 7
sub2 9 12
sub3 10 11
root3 14 21
sub4 15 20
sub5 16 17
sub6 18 19
root4 22 27
sub7 23 24
sub8 25 26

Ich hoffe die Left/Right-Werte passen. Der erste Eintrag ist ein
verstecktes "Root-Element". Aufgabe ist jetzt den Baum bis "sub2"
komplett aufzuklappen (sub3 ist ein "Blatt", soll also auch angzeigt
werden). Alle anderen Root-Einträge und auch Sub-Einträge bleiben
geschlossen. Ergebnis also:

root1
root2
sub1
sub2
sub3
root3
root4

Wie lässt sich das mit möglichst wenig SQL-Abfragen lösen oder bin ich
mit Nested Sets bei diesem Vorhaben auf dem Holzweg?

Vielen Dank im Voraus

CU

Manuel

Re: Nested Sets: Teilbaum komplett aufklappen?

am 19.03.2007 08:52:59 von Daniel Fischer

Manuel Reimer!

> Ich hoffe die Left/Right-Werte passen. Der erste Eintrag ist ein
> verstecktes "Root-Element". Aufgabe ist jetzt den Baum bis "sub2"
> komplett aufzuklappen (sub3 ist ein "Blatt", soll also auch angzeigt
> werden). Alle anderen Root-Einträge und auch Sub-Einträge bleiben
> geschlossen. Ergebnis also:
>
> root1
> root2
> sub1
> sub2
> sub3
> root3
> root4
>
> Wie lässt sich das mit möglichst wenig SQL-Abfragen lösen oder bin ich
> mit Nested Sets bei diesem Vorhaben auf dem Holzweg?

Wenn du das mit dem Aufklappen tatsächlich in der Datenbank hinterlegen
willst, kannst du das z.B. so machen (angenommen, es gibt noch eine Spalte
"ausgeklappt", left und right hab ich auch umgetauft):

UPDATE baum SET ausgeklappt = IF(
name IN (
SELECT parent.name
FROM baum AS parent, baum AS node
WHERE node.l BETWEEN parent.l AND parent.r
AND node.name = "sub2"
ORDER BY parent.l
),
TRUE,
FALSE
);

Das Statement klappt dann auch alle anderen Knoten ein; wenn das nicht
gewünscht ist, kannst du es umschreiben in ein UPDATE baum SET
ausgeklappt = TRUE WHERE name IN (... s.o. ...).

Wenn du es nicht in der Datenbank ablegen willst, kannst du das innere
SELECT auch einzeln verwenden, um den Pfad zu sub2 zu ermitteln, das sind
die Knoten, die du aufklappen musst. Alle anderen müssen eingeklappt
werden, um dein Ergebnis zu erhalten.


Gruß
Daniel

Re: Nested Sets: Teilbaum komplett aufklappen?

am 10.04.2007 09:26:56 von Manuel Reimer

Daniel Fischer wrote:
> Wenn du es nicht in der Datenbank ablegen willst, kannst du das innere
> SELECT auch einzeln verwenden, um den Pfad zu sub2 zu ermitteln, das sind
> die Knoten, die du aufklappen musst. Alle anderen müssen eingeklappt
> werden, um dein Ergebnis zu erhalten.

Sorry zunächst für die sehr späte Antwort...

Mit dem von dir vorgeschlagenen SELECT kann der Pfad zu einem Element
ermittelt werden. Das wäre dann in meinem Beispiel:

root2
sub2

Ich benötige aber für eine Navigation die komplette Ausgabe in der Form:

root1
root2
sub1
sub2
sub3
root3
root4

Bekannt ist nur "sub2". Frage ist eben, ob für eine Ausgabe in dieser
Art das Nested-Set-Modell überhaupt sinnvoll ist, denn ich kann zwar
einfach nach oben wandern (Pfad ermitteln) und auch einfach die
"Kind-Elemente" ermitteln. In all diesen Fällen wird allerdings all das,
was noch "drumherum" dargestellt werden soll, nicht erfasst.

CU

Manuel

--
Privatsphäre bald Geschichte? Vorratsdatenspeicherung, Bundestrojaner, ...
Informieren, bevor es zu spät ist! Es sind auch deine Rechte!
www.vorratsdatenspeicherung.de www.der-bundestrojaner.de
www.againsttcpa.com www.privatkopie.net www.foebud.org

Re: Nested Sets: Teilbaum komplett aufklappen?

am 13.04.2007 13:34:06 von Daniel Fischer

Manuel Reimer!

> Mit dem von dir vorgeschlagenen SELECT kann der Pfad zu einem Element
> ermittelt werden. Das wäre dann in meinem Beispiel:
>
> root2
> sub2

Die Wurzel des Baums muesste auch noch dabei sein.

> Ich benötige aber für eine Navigation die komplette Ausgabe in der Form:

Warum? Wenn diese Knoten *sichtbar* sein sollen, musst du nur die drei
Knoten im Pfad aufklappen.


Gruß
Daniel

Re: Nested Sets: Teilbaum komplett aufklappen?

am 18.04.2007 12:14:15 von Manuel Reimer

Daniel Fischer wrote:
> Die Wurzel des Baums muesste auch noch dabei sein.

Schon, aber die brauche ich sowieso nicht --> wird also nicht
ausgegeben.

>> Ich benötige aber für eine Navigation die komplette Ausgabe in der Form:

> Warum? Wenn diese Knoten *sichtbar* sein sollen, musst du nur die drei
> Knoten im Pfad aufklappen.

Sorry, falls ich nerve, aber auch nach weiterem Suchen und weiteren
Tests bin ich bei weitem nicht zu einer befriedigenden Lösung gekommen.

Um darzustellen, was ich in Etwa will, habe ich eine nette Demo
gefunden:

http://myiosoft.com/products/EasyFree/easyphptree/demo/

Hier wird in Etwa das gemacht, was ich auch brauche. Nur, dass hier der
Einfachkeit halber die ganze Tabelle ausgelesen wird, um dann gänzlich
ohne SQL mit PHP-Mitteln den Baum zu bauen. Ich bezweifle, dass es
sinnvoll ist, einfach die gesamte Tabelle abzuholen, obwohl
offensichtlich sogar eine solch einfache Lösung relativ schnell läuft.
SQL könnte man sich dann aber auch gleich schenken und die Navi in eine
CSV-Datei speichern...

Lage Rede, kurzer Sinn: Kann man etwas in dieser Art mit Nested Sets
realisieren? Wenn ja: Wie schwierig wäre das?

Vielen Dank im Vorauf für jeden Hinweis

CU

Manuel

--
Privatsphäre bald Geschichte? Vorratsdatenspeicherung, Bundestrojaner, ...
Informieren, bevor es zu spät ist! Es sind auch deine Rechte!
www.vorratsdatenspeicherung.de www.der-bundestrojaner.de
www.againsttcpa.com www.privatkopie.net www.foebud.org