PDA

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

crac
16-07-2002, 16:14
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

crac
16-07-2002, 18:45
@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 :)

crac
24-07-2002, 13:29
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.. :(