Archiv verlassen und diese Seite im Standarddesign anzeigen : Baumstruktur => pgsql
deathcon
16-07-2002, 11:31
Hallo, ich suche eine Funktion für php, in der ich eine Baumstruktur ähnlich eines Forums abbilden lassen kann.
Aufgebaut auf pgsql sollte die Seite dann spaeter so aussehen:
|1
|-1.1
|-1.2
|--1.2.1
|--1.2.2
|---1.2.2.1
|--1.2.3
|-1.3
|-1.4
Hat jemand schonmal so ein script gesehen/geschrieben?
Vielen dank
deathcon
ein moeglicher loesungsansatz ist das nested set model. es ist v.a. fuer schnelles auslesen aus der datenbank gedacht. das einfuegen von neuen nodes ist ein bisschen komplizierter aber wenn das system einmal steht, ist es kaum uebertreffbar, was die performance angeht ...
hier ein link dazu: (es gibt viele andere sites dazu -> google)
http://users.starpower.net/rjhalljr/Serve/AccSql/traer.html
jensemann
16-07-2002, 16:46
Hi
Hier findest du auch ein sehr gutes howto dazu:
http://develnet.org/tech/tutorials/3.1.html
bezieht sich zwar auf mysql sollte aber kein großes problem sein das nach pgsql zu portieren.
Mfg jensemann
@jensemann:
genau durch diese howto bin auf dieses modell gestossen ... ist wirklich ein guter artikel (hatte den link leider vergessen) ;)
jensemann
16-07-2002, 18:53
Hi
@crac (Junky ? :D ;) *g* )
Ich kannte Nested Sets auch erst seit dem Artikel, wenn man es erstmal wirklich verstanden hat ist das sehr mächtig und einfach zu verwenden. Ich werde demnächst anfangen ein CM System Framework mit unter anderem einem Foren Plugin zu schreiben wo ich das nutzen werde, performanter geht es nicht mehr als mit nested sets (zumindest im bereich von mysql und pgsql), allerdings werde ich das in perl schreiben, von php hab ich solangsam die Schnauze voll ...
Mfg jensemann
deathcon
24-07-2002, 12:59
Also ich habs mir durchgelesen, scheint wirklich eine gute Loesung zu sein, aber hab ich mit der Selectabfrage probleme, da ich Postgres verwende und nicht MySQL wie in der Anleitung:
SELECT node1.payload,
COUNT(*) AS level
FROM node AS node1,
node AS node2
WHERE node1.root_id = 1
AND node2.root_id = 1
AND node1.lft BETWEEN node2.lft AND node2.rgt
GROUP BY node1.LFT;
Mein Table sieht so aus:
Table "faq_cat"
Column | Type | Modifiers
---------+---------+--------------------------------------------------------
cat_id | integer | not null default nextval('"faq_cat_cat_id_seq"'::text)
root_id| integer |
text | text |
lft | integer |
rgt | integer |
die ROOD_ID schreibe ich immer manuell.
Schonmal danke fuer eure Muehen :)
Original geschrieben von deathcon
SELECT node1.payload,
COUNT(*) AS level
FROM node AS node1,
node AS node2
WHERE node1.root_id = 1
AND node2.root_id = 1
AND node1.lft BETWEEN node2.lft AND node2.rgt
GROUP BY node1.LFT;
ich kenne mich mit postgres nicht aus, aber ich wuerde zumindest mal die werte der abfrage anpasse:
SELECT node1.text,
COUNT(*) AS level
FROM faq_cat AS node1,
faq_cat AS node2
WHERE node1.root_id = 1
AND node2.root_id = 1
AND node1.lft BETWEEN node2.lft AND node2.rgt
GROUP BY node1.LFT;
das fettgeschriebene musst du aendern ... aber sehrwahrscheinlich hast du das sowieso bereits gemacht ... :)
deathcon
24-07-2002, 13:59
test=# SELECT node1.text, COUNT(*) AS level FROM faq_cat AS node1, faq_cat AS node2
test-# WHERE node1.root_id = 1 AND node2.root_id = 1 AND node1.lft BETWEEN node2.lft AND node2.rgt GROUP BY node1.LFT;
ERROR: Attribute node1.text must be GROUPed or used in an aggregate function
funzt net so ganz.. :(
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.