Schulung, Beratung und Entwicklung

Glück IT

Gesellschaft für IT Beratung, Schulung und Entwicklung

NEWS

Content Management System ®CMAssist

Parent / Child Beziehungen in MySQL (Rekursion)

Wie wird eine Baumstruktur mit einer Parent / Child Beziehung aufgelöst?

Wenn im SQL eine Baumstruktur mit einer Parent / Child Beziehung aufgelöst werden soll, ist dies auf gängigen Datenbanken
in der Regel mit einem WITH Statement zu lösen.
MySQL bietet hierfür allerdings leider keine Unterstützung. Daher ist in der Regel die Umsetzung per Stored Procedure
nötig. In einfachen Fällen kann ein SQL, welches wiederum nur auf einer MySQL läuft, eine einfache performante Lösung sein.
Der Trick Funktioniert dadurch das die MySQL Variablen innerhalb eines SQL´s erlaubt und diese auch pro Datensatz setzt.

Die Tabelle

CREATE TABLE Table1
(`id` int, `content` varchar(1), `parentid` int)
;

Beispiel Daten

INSERT INTO Table1
(`id`, `content`, `parentid`)
VALUES
(1, 'a', 5),
(5, 'd', 3),
(3, 'k', 7),
(6, 'o', 2),
(2, '0', 8)
;
Holt alle Vorgänger

SELECT t.id, t.content, @pid := t.parentid AS parentid
FROM (SELECT * FROM Table1 order by id DESC) t
JOIN (SELECT @pid := 5) tmp
WHERE t.id = @pid


Holt alle Nachfolger

SELECT @pid := t.id id, t.content, t.parentid
FROM (SELECT * FROM Table1 order by parentid ASC) t
JOIN (SELECT @pid := 5) tmp
WHERE t.parentid = @pid

Holt alle Vorgänger und Nachfolger

SELECT @pid := t.id id, t.content, t.parentid
FROM (SELECT * FROM Table1 order by parentid ASC) t
JOIN (SELECT @pid := 5) tmp
WHERE t.parentid = @pid
UNION -- löscht die nachfolgende Zeile, diese ist nur dazu da die Variable wieder auf 5 zu setzen
SELECT id, content, @pid:=5
FROM Table1
WHERE parentid=5
UNION ALL
SELECT t.id, t.content, @pid := t.parentid AS parentid
FROM (SELECT * FROM Table1 order by id DESC) t
JOIN (SELECT @pid := 5) tmp
WHERE t.id = @pid


Sollte zum testen keine MySQL zur Verfügung stehen, kann dies direkt Online unter http://sqlfiddle.com getestet werden.