[MySQL] Rekursive Abfrage parent child Tabelle

Templorials

Erfahrenes Mitglied
Grüß euch,

ich habe folgende Tabelle:

Code:
id    parent    type
1     2           3
2     3           2
3     4           2
4     5           1
5     0           1
(parent 0 --> kein parent)

Jetzt habe ich folgende Abfragen:
Gib mir alle hierarchisch darüber/darunter liegenden ids ausgehend von id=2 --> Ergebnis: darunter: 1 darüber: 3,4,5
Gib mir die hierarchisch höchste id ausgehend von id=2 --> Ergebnis: 5
oder auch
Gib mir die hierarchisch höchste id mit type=2 ausgehend von id=1 --> Ergebnis: 3

Ist das möglich mit jeweils einem SQL Query?

Danke
 
Grundsätzlich zu Trees habe ich mal 2 SQLs zusammengestellt
http://wiki.yaslaw.info/wikka/MySQLTree

Diese kann man ans Quelle für komplexere SQLs nehmen

Das mit dem Typ könnte dann etwa so aussehen
SQL:
SELECT
	dat.id
FROM
	(
		SELECT 
			@rownum := @rownum+1 AS rownum, 
		    @id AS id,
		    @id := IF(@id IS NOT NULL, (SELECT parentID FROM nav WHERE id = @id), NULL) AS parentID
		FROM
		    nav,
		    (SELECT @id := 9, @rownum := 0) AS vars
		WHERE
		    @id IS NOT NULL
	) AS dat
	JOIN nav ON dat.id = nav.id
WHERE
	nav.type = 4
ORDER BY 
	dat.rownum DESC
LIMIT 1
 
Zuletzt bearbeitet von einem Moderator:
Danke für die Antwort. Hat mir geholfen.

Allgemeine Frage dazu.. derzeit habe ich die Struktur mit Hilfe eines Scripts ausgelesen sprich mehrere einzelne SQL Statements wo immer der nächste Parent ermittelt wird bis es keinen mehr gibt. Ist das über so einen komplexen SQL Query überhaupt performanter? In meinem eigenen Fall ist es denk ich mir sowieso egal da es max. nur 5 Stufen gibt.
 
Hallo,

mir hat Yaslaw mit seiner Anwort sehr weiter geholfen. Also ich habe es gelöst, aber bin nicht wirklich sehr zufrieden.

Man kann bei mir jeden Knotenpunkt (also egal welche Tiefe) anwählen. Ich brauche nun öfters eine Abfrage, wo ich in einem WHERE id IN (...) auf alle ausgewählten IDs und deren Kind-Elemente zugreifen muss. Das Statement aus dem Wiki ist sehr lang, als dass ich es in jedes Statement kopiere, wo es gebraucht wird. Kann man das auch irgendwie anders lösen? Also Stored Funciton und Procedure konnte ich schon ausschließen. Eine View wäre perfekt gewesen, doch auch die hilft mir nicht weiter, da das Statement Subqueries und Variablen beinhaltet.

Meine Frage ist:
Kann ich die Abfragen irgendwie einfacher gestalten, so dass ich angenehmer auf die Elemente und ihre Kinder zugreifen kann?


EDIT:
Kann mir vllt jemand sagen, ob ich mit einem TRIGGER bei Änderung der Tabelle eine andere Tabelle komplett neu befüllen kann? Und wenn ja, wie?
 
Zuletzt bearbeitet:
So, werd das jetzt so lösen, dass der Admin im Backend die oben gezeigte Tabelle bearbeiten kann und dann zu einem beliebigen Punkt "committen" kann. Dann wird die zweite Tabelle geleert und neu befüllt, so wie Yaslaws Ergebnis aussieht.

Denke damit habe ich eine zufriedenstellende Lösung für mich ^^
 
Zurück