NestedSet: Performant Pfad suchen

ZodiacXP

Erfahrenes Mitglied
Folgendes ist gegeben:

Mehrere Pfade
Bad > Decke > Licht
Küche > Ofen > Licht
Ofen > Küche > Licht
(nur als Beispiel)

Passende Tabelle in mySQL
ID, parent, data, depth, left, right
1, 0, 'Bad', 0, 1, 6
2, 1, 'Decke', 1, 2, 5
3, 2, 'Licht', 2, 3, 4

4, 0, 'Küche', 0, 7, 12
5, 4, 'Ofen', 1, 8, 11
6, 5, 'Licht', 2, 9, 10

7, 0, 'Ofen', 0, 13, 18
8, 7, 'Küche', 1, 14, 17
9, 8, 'Licht', 2, 15, 16

Sequenz mit Tiefe
Küche > Ofen > Licht
Tiefe: 2

Gesucht ist eine SQL-Abfrage, die den Pfad zu der gegebenen Sequenz ausgibt.

Meine Lösung schafft es noch nicht ganz und ist auch sehr wahrscheinlich nicht die schnellste:
Code:
	SELECT B.`ID`, B.`data`, B.`left`, B.`right`
	FROM
		`sites` as A,
		`sites` as B
	WHERE 
		   A.`depth` = 2
		&& A.`data` = 'Licht'
		&& B.`left` <= A.`left`
		&& B.`right` >= A.`right`
	ORDER BY B.`left`

Problem ist insbesondere das alle Pfade angezeigt werden. Zudem soll es auch für andere gegebene Sequenzen passen bei größeren Tiefen mit ähnlicher "Redundanz":

Küche > Ofen > Abzugshaube > Licht
Küche > Abzugshaube > Ofen > Licht
(nur als Beispiel)
 
Zuletzt bearbeitet:
Hi,

hmm, da die Begriffe ja anscheinend völlig beliebig vorkommen können, fällt mir da nur eine Lösung über eine Gruppierung ein, die Dir eine kommagetrennte Liste mit den Pfadknoten liefert:

SQL:
SELECT CAST(GROUP_CONCAT(`parent`.`id` ORDER BY `parent`.`left` ASC) AS CHAR) AS `knotenpfad`
   FROM `tabelle` AS `node`, 
      `tabelle` AS `parent`
   WHERE `node`.`left` BETWEEN `parent`.`left` AND `parent`.`right`
   GROUP BY `node`.`id` 
   HAVING CAST(GROUP_CONCAT(`parent`.`data` ORDER BY `parent`.`left` ASC) AS CHAR) = 'Küche,Ofen,Licht'

LG
 
Zurück