NestedSet - Algorithmus gesucht

F.o.G.

Erfahrenes Mitglied
Hallo,

ich brauche einen Algorithmus für einen Nested Set Baum in MySQL.

Ich nutze einen NestedSet Baum mit mehreren Wurzeln, es befinden sich also mehrere Nested Sets in einer Tabelle.

Ich möchte nun mit einer Abfrage alle Eltern eines Eintrags und deren Geschwister haben. Stellt man sich beispielsweise den Windows Explorer vor, so sieht man beim Navigieren in tieferen Ebenen ja nicht nur das aktuelle Verzeichnis und dessen 'Eltern', sondern auch die Unterverzeichnisse der Eltern.

Alle meine Versuche dahin schlugen bis jetzt fehl.

-----

Ein zweiter Algorithmus den ich brauche ist, alle Geschwister eines Eintrags zu finden, ohne dabei auf die Eltern zurück greifen zu müssen ... Das muss doch auch irgendwie gehen.
Ich speichere zwar das Level eines jeden Eintrag separat (ja man kann es auch errechnen), aber mit diesem Ansatz bekommt man unwillkürlich auch Einträge aus anderen Unterästen des selben Levels......

Ich hoffe hier ein paar Anregungen zu finden.

Ciao, Jörg
 
Zuletzt bearbeitet:
Vielen Dank, den Link kannte ich schon.

Dieses Tutorial war auch eines der ersten, die ich zum Thema gelesen habe, und es ist auch sehr gut.

Allerdings findet man nirgendwo weiterführende Queries (die vorletzte PHP Mag Ausgabe hatte einige gute).

Das mit den Geschwistern habe ich nun anders gelöst. da ich mehrere Wurzelknoten in der DB habe muss ich bei der Geschwisterabfrage sowieso abfragen, ob es sich um einen Root Node handelt oder nicht. Da ich die Abfrage also sowieso machen muss, habe ich für alle Knoten die keine Wurzel sind ja auch die ElternID.

Das erste Problem ist allerdings etwas komplexer, aber das muss gehen. Ich kann ja auch von einem beliebigen Punkt aus alle Unterkategorien ausgeben, also muss es ja auch umgekehrt gehen. ...... Naja..... Ich poste hier auch mal, wenn ich meine Klasse veröffentliche.

Ciao, Jörg
 
Ja, der Artikel war in der PHP-Mag

Wenn du diesen Artikel haben möchtest, wäre ich gerne bereit, dir den zur Verfügung zu stellen, sofern er nicht mehr online ist!
 
Hab den Artikel auch gelesen aber mein PHPMAG beim Umzug
verschlampt. Ist es vielleicht möglich mir die Seite ebenfalls zur
Verfügung zu stellen ?

Jona
 
Also ich persönlich brauch den Artikel nicht, da ich die PHP Mag abonniert habe. Trotzdem danke.

Ansonsten bastel ich gerade an meiner Klasse. es sind schon viele Abfragen machbar, wie zB. den Pfad von einer Wurzel bis zu einem bestimmten Zweig auszulesen oder alle Nachfahren zu bekommen.
Ich bau jetzt noch Methoden zum verschieben der Äste.
Naja, mein Problem ist immer die Dokumentation, wahrscheinlich packe ich einfach eine per PHP Doc generierte Seite dazu .....

Naja....aber die Abfrage die ich hier gesucht habe, ist mir immer noch nicht eingefallen ;)

Ciao, Jörg
 
F.o.G. hat gesagt.:
Hallo,

ich brauche einen Algorithmus für einen Nested Set Baum in MySQL.

Ich nutze einen NestedSet Baum mit mehreren Wurzeln, es befinden sich also mehrere Nested Sets in einer Tabelle.

Ich möchte nun mit einer Abfrage alle Eltern eines Eintrags und deren Geschwister haben. Stellt man sich beispielsweise den Windows Explorer vor, so sieht man beim Navigieren in tieferen Ebenen ja nicht nur das aktuelle Verzeichnis und dessen 'Eltern', sondern auch die Unterverzeichnisse der Eltern.

Alle meine Versuche dahin schlugen bis jetzt fehl.
Vorrausgesetzt das du jedem Ast auch eine root_id zugewiesen hast (anders geht es eigentlich auch nicht), wäre es doch ein Lösungsansatz, zunächst die root_id des Astes zu bestimmen und anschließend über die root_id von der Wurzel an auszulesen.

-----

Ein zweiter Algorithmus den ich brauche ist, alle Geschwister eines Eintrags zu finden, ohne dabei auf die Eltern zurück greifen zu müssen ... Das muss doch auch irgendwie gehen.
Ich speichere zwar das Level eines jeden Eintrag separat (ja man kann es auch errechnen), aber mit diesem Ansatz bekommt man unwillkürlich auch Einträge aus anderen Unterästen des selben Levels......

Ciao, Jörg
Auch hier sollte die root_id helfen.

Ich benutze folgende Tabellenstruktur:
PHP:
CREATE TABLE `kategorien` (
  `baum_id` int(10) unsigned NOT NULL auto_increment,
  `root_id` int(10) unsigned NOT NULL default '0',
  `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`)
)
Es wird zu jedem Ast die root_id gespeichert.
Der Vorteil an diesem Modell ist, das ich nicht das Level extra speichere sondern aus einem Querry errechne.
aufbauend auf:
http://ffm.junetz.de/members/reeg/DSP/node10.html

viele Grüße
bloddy newbie
 
Release der Nested Set Klasse aus dem C*B Projekt

Hi, Ich habe meine Klasse jetzt auf
Content*Builder.de veröffentlicht, genauer gesagt hier

Da ich das selbe DB Modell verwende wie DB_NestedSet (also mit parentID, level und mehreren Wurzeln), sind viele der Methoden Namen die selben.

Die Klasse bietet aber viele Abfrage Methoden, braucht auch kein PEAR (das war der Hauptgrund für die Erstellung, da PEAR leider immer noch nicht auf jedem Server korrekt eingerichtet ist).

Die Klasse lockt die MYSQL Tabelle direkt, es ist also keine zusätzliche Lock Tabelle wie bei DB_NestedSet erforderlich.

Was die Klasse noch nicht kann ist das verschieben von Zweigen oder das Sortieren.

Viel Spaß und postet euer Feedback.

Ciao, Jörg
 
Zurück