Einzelnen Beitrag anzeigen

Benutzerbild von S2B
S2B

Registriert seit: 1. Feb 2004
Ort: Aachen
1.268 Beiträge
 
#1

Navigation mit Nested Sets

  Alt 28. Mai 2009, 00:11
Datenbank: MySQL • Version: 5.0.x • Zugriff über: PHP
Hallo zusammen.

Ich versuche gerade, eine Navigationslösung für eine Website zu basteln, und das mit Nested Sets. Im Moment habe ich folgenden Baum:
Code:
[b]Item 1[/b]
  [b]Item 2[/b]
    [b]Item 3[/b]
      [b]Item 4[/b]
      [b]Item 5[/b]
    [b]Item 6[/b]
      Item 7
      Item 8
    [b]Item 9[/b]
  [b]Item 10[/b]
  [b]Item 11[/b]
[b]Item 12[/b]
Das ganze befindet sich in dieser Tabelle:
SQL-Code:
CREATE TABLE IF NOT EXISTS `s2b_navigation_items` (
  `item_id` mediumint(8) unsigned NOT NULL auto_increment,
  `nav_id` smallint(5) unsigned NOT NULL,
  `left_id` mediumint(8) unsigned NOT NULL,
  `right_id` mediumint(8) unsigned NOT NULL,
  `item_title` varchar(100) collate utf8_unicode_ci NOT NULL,
  `item_url` varchar(255) collate utf8_unicode_ci default NULL,
  `content_id` mediumint(8) unsigned default NULL,
  PRIMARY KEY (`item_id`),
  KEY `content_id` (`content_id`),
  KEY `item_left_id` (`left_id`,`right_id`),
  KEY `item_root_id` (`nav_id`)
)
Nun zu meinem Problem: Diesen Baum würde ich nun gerne so anzeigen, wie das für Navigationen üblich ist, sprich nur einen Teil des Baums. Wenn Item 12 aktiv ist, sollen also lediglich Item 1 und Item 12 angezeigt werden; wenn hingegen Item 3 (oder Item 5) aktiv ist, sollen die Items 1, 2, 3, 4, 5, 6, 9, 10, 11 und 12 (siehe oben in fett) angezeigt werden. Allgemein bedeutet das:
  1. Die oberste Navigationsebene
  2. Den Pfad zum aktiven Eintrag sowie alle Nachbarknoten auf diesem Pfad
  3. Die direkten Nachkommen des aktiven Eintrags, sofern vorhanden
Die Frage ist nun, wie ich das ganze am geschicktesten auslese. Ich habe bereits einiges an Zeit in SQL-Abfragen gesteckt, genauso viel Zeit in die Verarbeitung des kompletten Baums per PHP - leider bisher ohne Erfolg. Zwar habe ich mithilfe von Google ein Query ("Find the Immediate Subordinates of a Node") gefunden, das angeblich die Lösung zu meinem Problem sein soll (wenn ich die englische Beschreibung richtig verstanden habe), jedoch bekam ich ein anderes Ergebnis...

Mein Query zum Auslesen des kompletten Baums sieht so aus:
SQL-Code:
SELECT n.item_title, n.item_url, n.content_id, c.content_path,
   (COUNT(p.item_id) - 1) AS level, ROUND((n.right_id - n.left_id - 1) / 2) AS offspring
FROM s2b_navigation_items n
INNER JOIN s2b_navigation_items p
   ON n.left_id BETWEEN p.left_id AND p.right_id
LEFT JOIN s2b_content c
   ON c.content_id = n.content_id
WHERE n.nav_id = 1
GROUP BY n.item_id
ORDER BY n.left_id
Hat jemand einen Tipp für mich, wie ich da weiter vorgehen könnte? Irgendwie wundert es mich, dass es für mein Problem nicht schon hunderte Codeschnipsel gibt, denn eigentlich ist das doch ein naheliegender Anwendungsfall für Nested Sets...
Simon Praetorius
Gruß
S2B
  Mit Zitat antworten Zitat