hierarchische warengruppen

Was mir noch fehlt für die nested set Modell fehlt, ist die abfrage für eine quer abfrage

mal mal weiter drüber nachdenken und wenn ich ne idee dazu habe werde ich mal ein tut dazu loslassen :)

sprich nicht nur ne auflistung vom ast zum root sondern auch Äste die auf gleicher Ebene liegen

eine ne Idee?
 
verstehe nicht ganz was du meinst. :(
jedoch hab ich mich dermaßen mit dem kram beschäftigt, das ich keine probs mehr mit habe.
vielleicht finden wir ja eine lösung für dein problem.

greetz bloddy
 
@bloody

wen du so plan von dem modell hast dann versuch doch mal mit kurzen worten zu erklären was mich da erwartet

habe das o.g. beispiel von melmager ma angeguckt und schon zu 60 % in meinen shop reingebastelt...für meine verhältnisse denk ich mal reicht das erst mal...

nur wenn es für so etwas extra modelle gibt dann werd ich mir das doch gerne mal geben

mfg

JanDelay
 
ich habe mir das tutorial "Status Quo" solange reingezogen, bis ich es endlich kapiert habe.

hier gehts zum tutorial

im prinzip sieht die tabelle für die ordnerstruktur in etwa so aus:
PHP:
CREATE TABLE baumtab (
  baum_id int(10) unsigned NOT NULL auto_increment,
  root_id int(10) unsigned NOT NULL default '0',
  baum varchar(64) default NULL,
  beschreibung varchar(250) NOT NULL default '',
  lft int(10) unsigned NOT NULL default '0',
  rgt int(10) unsigned NOT NULL default '0',
  PRIMARY KEY  (baum_id),
  KEY root_id (root_id)
) TYPE=MyISAM;

Erklärung:
baum_id ist eine eindeutige ID eines jeden Ordners bzw. Subordners und man kann darüber einen einzelnen Ordner ansprechen.

root_id ist eine Art Zugehörigkeit zu der Wurzel eines jeweiligen Baumes und wird neuen Wurzeln fortlaufend erteilt. Am besten kann diese ID anhand eines Baumstrukturforums erklären.
Bsp.:
Es existieren 2 Threads:
1, <-- root_id = 1; baum_id = 1
2 <-- root_id = 2; baum_id = 2
zu diesen Threads existieren jeweils 2 Antworten:
1_1, 1_2, <-- root_id = 1; baum_id = 3
2_1, 2_2 <-- root_id = 2; baum_id = 4
zu diesen Antworten existiert jeweils eine Antwort:
1_1_1, 1_2_1 <-- root_id = 1; baum_id = 5
2_1_1, 2_2_1 <-- root_id = 2; baum_id = 6

Bis hierhin ist alles noch ganz einfach und auch nachvollziehbar. Die Schwierigkeit kommt erst bei lft und rgt.
Folgende Grafik erläutert die felder lft und rgt sehr gut:
img10.png

Für uns sind lediglich die beiden Ziffern im unteren Bereich eines jeden Kästechens interessant, wobei dieses Bild nur einen einzigen mit sehr vielen Verschachtelungen Forenthread abbildet.
Ich kann es den Sachverhalt schlecht in Worte fassen, aber ich denke nach einer ausführlichen Betrachtung versteht man, was die beiden Ziffern bewirken. Die linke ist steht jeweils für lft und die rechte für rgt.

Du mußt dir die Queries auch nicht aus den Fingern saugen - das haben andere schon erledigt, so das du einfach darauf zurückgreifen kannst:
http://ffm.junetz.de/members/reeg/DSP/node10.html#SECTION04344000000000000000

cu bloddy
 
@bloddy newbie

ok ich versuche es mal zu erklären. Da ich das ganze auch mit einem Menü kombinieren möchte, muss es möglich sein nicht nur Nachfolger und
Väter rauszusuchen sondern auch Einträge die auf der gleichen Ebene liegen. Ich denke das geht nur mit einem dritten feld in der db

root 1 25
a 2 5
aa 3 4
b 6 11
ba 7 10
bb 8 9

das ist mal ne kurzform und die frage ist wie bekomme ich a und b allein ohne die unterpunkte aa,ba,bb

edit: mal dein bild nimm
wie komme ich an die ausgabe von a , b , c :)

wenn du das bild um 90 Grad nach links kipps haste ja da menu was ich brauche. wenn du dann menutechnich auf b bist muss ja auch b1 und b2
angezeigt werden zusätzlich zu den a,b und c

ausgabe
a
b
c

dann gehste auf b dann kommt die ausgabe
a
b
b1
b2
c
 
Zuletzt bearbeitet:
PHP:
SELECT node1.baum, node1.baum_id, COUNT(*) AS level FROM baumtab AS node1, baumtab AS node2 WHERE node1.lft BETWEEN node2.lft AND node2.rgt GROUP BY node1.LFT

level ist in diesem fall die ebene (von 1 bis knipps).
bei dir sehen die levels dann so aus:
baum | lft | rgt | level
------------------------
root 1 25 <-- Level 1
a 2 5 <-- Level 2
aa 3 4 <-- Level 3
b 6 11<-- Level 2
ba 7 10 <-- Level 3
bb 8 9 <-- Level 3

Nun die Level zu filtern, sollte kein problem darstellen :D.

Greetz Bloddy

edit:

ich würde an deiner stelle das menü anders aufbauen - also nicht nur eine root sondern zu jedem Überpunkt eine neue root...so kannst du viel einfach selektieren, da du ja die root_id bei jedem Überpunkt um eins erhöhst...mit sicherheit kommt das auch der ausführungsgeschwindigkeit des queries zu gute ^^.
wenn du diesbezüglich noch fragen hast, kann ich dir gerne noch mehr code geben, denn ich habe es auch mit mehreren root_id programmiert.

cya
 
Zuletzt bearbeitet:
@bloddy newbie

dann sind wir uns ja einig :)
man braucht noch ein feld . Ich habe mir schon ein Paar Stunden den Kopf gemartert aber ohne das dritte feld gehts nicht.


Edit: Trotzdem noch ein wenig grübeln geh
Denn die frage ist: Verwalte ich drei steuerungsfelder in der DB
oder
lasse ich meine Version wie sie ist
 
Zuletzt bearbeitet:
ne kein 3. feld...level ist nur virtuell und entsteht durch count(*) AS level.

die felder reichen schon :)
 
deswegen für jeden überpunkt ne eigene root_id, denn dann kannst du noch nach der root_id selektieren

PHP:
//angenommen:
//a -> root_id = 1
//b -> root_id = 2
//c -> root_id = 3
//d -> root_id = 4
$x = 1 //was weiß ich - irgend ein Überpunkt deines Menüs (a)
SELECT node1.baum, node1.baum_id, COUNT(*) AS level FROM baumtab AS node1, baumtab AS node2 
WHERE node1.root_id = '$root_ids[$x]' AND node2.root_id = '$root_ids[$x]' AND node1.lft BETWEEN node2.lft AND node2.rgt GROUP BY node1.LFT

ich lese erst alle root_id ist ein array und schleife es dann durch.
wenn die gesuchte root_id (z.b. a) dann an der reihe ist, gebe ich bis level xyz aus ansonsten nur level 1.
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück