Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
dynamisches Treemenu mit Nested Sets [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
dynamisches Treemenu mit Nested Sets


 
KaiCrow
08-02-2003, 18:51 
 
Hallo,

das Problem "Nested Sets" wurde hier zwar schon ein paarmal diskutiert, aber leider habe ich für mein Problem noch keine Losung gefunden.

Tabellenstruktur "tbl_menu"

node_id menu lft rgt
---------------------------------------------
1 Shop 1 24
2 Alkoholika 2 19
3 Alkoholfrei 20 23
4 Biere 3 8
5 Schnaps 9 18
6 hochprozentig 10 15
7 LowProzent 16 17
8 Grasovska 11 12
9 Korn 13 14
10 Landskron 4 5
11 Radeberger 6 7
12 O-Saft 21 22

-----------------------------------------------------------
-----------------------------------------------------------
Ausgabe des gesamten Baumes über die Query

"SELECT node1.node_id,node1.lft,node1.rgt,node1.beschreibung,COUNT(*) AS level
FROM tbl_menu AS node1,tbl_menu AS node2
WHERE node1.lft BETWEEN node2.lft AND node2.rgt GROUP BY node1.LFT"

nodeID lft rgt level menupunkt
-----------------------------------------------------------
1 1 24 1 Shop
2 2 19 2 |---Alkoholika
4 3 8 3 |---|---Biere
10 4 5 4 |---|---|---Landskron
11 6 7 4 |---|---|---Radeberger
5 9 18 3 |---|---Schnaps
6 10 15 4 |---|---|---hochprozentig
8 11 12 5 |---|---|---|---Grasovska
9 13 14 5 |---|---|---|---Korn
7 16 17 4 |---|---|---LowProzent
3 20 23 2 |---Alkoholfrei
12 21 22 3 |---|---O-Saft

-----------------------------------------------------------
-----------------------------------------------------------

Die Ausgabe, die ich erreichen will:
Beispiel:
Bei Klick auf Schnaps soll das nächste Level unter Schnaps ausgegeben werden.
Außerdem soll man alle "Brüder" [Biere] und den "Vater" [Alkoholika] von Schnaps, sowie die "Brüder
des Vaters" [Alkoholfrei] angezeigt bekommen.

nodeID lft rgt level menupunkt
-----------------------------------------------------------
1 1 24 1 Shop
2 2 19 2 |---Alkoholika
4 3 8 3 |---|---Biere
5 9 18 3 |---|---Schnaps
6 10 15 4 |---|---|---hochprozentig
7 16 17 4 |---|---|---LowProzent
3 20 23 2 |---Alkoholfrei
-----------------------------------------------------------
-----------------------------------------------------------


Habe schon einiges probiert, komme aber nie auf das gewünschte Ergebnis!
...wäre schön, wenn mir jemand weiterhelfen könnte.

Ich hoffe das Beispiel ist anschaulich genug!
:beer:

Ciao, KaiCrow

 
Berni
08-02-2003, 18:57 
 
hast du mal in unsere Tutorials geschaut?

 
Günni
08-02-2003, 19:00 
 
Hi,
schau mal hier rein
http://www.php-resource.de/tutorials/read/21/1/

 
KaiCrow
08-02-2003, 19:00 
 
ja...das Tutorial hat mir auch geholfen, den gesamten Baum auszlesen. Allerdings brauche ich ja nur einen bestimmten Teil.

 
KaiCrow
09-02-2003, 13:04 
 
Ich habe nochmal ein bißchen gegrübelt und bin auf keine schlüssige Abfrage gekommen, die das exakte Ergebnis bringt, was ich will.

Es lassen sich jedoch 3 einzelne Anfragen an die Datenbank formulieren, die zusammengenommen die Ausgabe produzieren, die ich haben will.
Am besten wäre es jetzt, wenn man diese Abfragen in einer zusammenfassen könnte...ich denke mal, JOIN wäre dafür zuständig, ich weiß aber nicht genau, wie ich das anstellen soll.

Weiß jemand, wie das funktionieren könnte.
Oder...kann man die einzelnen Abfrageergebnisse "im Nachhinein" noch zusammenführen?

Hier meine Queries:


//Gesamte Hauptebene "Shop"
$query3="SELECT node1.node_id,node1.lft,node1.rgt,node1.beschreibung,COUNT(*) AS level FROM tbl_menu AS node1, tbl_menu AS node2
WHERE
node1.lft BETWEEN node2.lft AND node2.rgt
AND
(node1.lft BETWEEN 18 AND 24)
GROUP BY node1.LFT HAVING level=2";

//Brüder & jeweiligen Väter zur Ebene "Schnaps"
$query2="SELECT node1.node_id,node1.lft,node1.rgt,node1.beschreibung,COUNT(*) AS level FROM tbl_menu AS node1, tbl_menu AS node2

WHERE
node1.lft BETWEEN node2.lft AND node2.rgt
AND
(node1.lft BETWEEN 1 AND 9)
GROUP BY node1.LFT HAVING level<=3";

//Söhne von "Schnaps"
$query1="SELECT node1.node_id,node1.lft,node1.rgt,node1.beschreibung,COUNT(*) AS level FROM tbl_menu AS node1, tbl_menu AS node2

WHERE
node1.lft BETWEEN node2.lft AND node2.rgt
AND
(node1.lft BETWEEN 9 AND 18)
GROUP BY node1.LFT HAVING level=4";





...oder...gehe ich das ganze Problem zu kompliziert an und es gibt womöglich doch noch eine einfachere Lösung für mein Problem?

Ciao

- -

Alle Zeitangaben in WEZ +2. Es ist jetzt 16:09 Uhr.