select kaskadieren

Commu

Benutzer
Beiträge
14
Hallo Zusammen,

ich habe in einer Tabelle neben der ID zwei chronologische Spalten die einen Datensatz vorher oder nachher anzeigen. Es könnte sein das in dem Datensatz vorher oder auch nachher, weitere ID stehen die einen entsprecheden datensatz wiederum anzeigen.

Das würde ich gerne nach einander anzeigen.

Code:
SELECT id, chro_vor , chro_nach FROM medien WHERE id = 3229 ORDER BY jahr_von

| id | chro_vor | chro_nach |
-------------------------------
| 3229 | 3228 | 3237 |
 
Werbung:
Das geht mit einer Common Table Expression (CTE) und Rekursion. Ist eigentlich mittlerweile in allen SQL DBMS umsetzbar, allerdings unterscheidet sich das hin und wieder von der Syntax. Auch wäre DBMS und Version gut zu wissen, also MySQL oder MariaDB und Version.

Beispiel unter Recursive Common Table Expressions
Code:
WITH RECURSIVE cte (n) AS(  SELECT 1  UNION ALL  SELECT n + 1 FROM cte WHERE n < 5)SELECT * FROM cte;

Welche Rekursionstiefe kann in deiner Tabelle vorkommen? Ein wenig sonderbar ist, das es eine ID vor und eine ID nach gibt, dass ist theoretisch redundant.

Vermutlich in etwa so:
Code:
WITH RECURSIVE cte AS(  
SELECT 0 AS n, id, chro_vor , chro_nach FROM medien WHERE id = 3229 --Alternativ wäre hier WHERE chro_vor IS NULL um Root-Objekte zu wählen
UNION ALL
SELECT cte.n + 1, medien.id, medien..chro_vor, medien.chro_nach
FROM cte
INNER JOIN medien
ON cte.chro_nach = medien.id
AND cte.id = medien.chro_vor
WHERE cte.n < 5)
SELECT * FROM cte;
 
zur Erläuterung:
ich habe mir eine DB zur Verwaltung meiner Film- + Serien-Dateien erstellt. In der Chronologie zu Rambo 3 habe ich einen Film vorher und nachher festgehalten. Ich weiß das es mit sicherheit andere und bessere Lösungen gibt, aber für meinen Hausgebraucht reicht das komplett aus.:)

ich habe nach deiner Anregung zu Recursive Common Table Expressions gegooglet und folgenden MySQL erstellt.

SQL:
WITH RECURSIVE
vorher(id, chro_vor) AS
(SELECT id, chro_vor FROM medien
UNION
SELECT m.id, s.chro_vor
FROM medien m, vorher s
WHERE m.chro_vor = s.id)
SELECT m.id,m.titel
FROM medien m, vorher s, medien vor
WHERE vor.id = 3229
AND m.id = s.id
AND s.chro_vor = vor.id

Vielen Dank für die Hilfe
 
Werbung:
FROM tabelle1, tabelle2 ist effektiv ein Join. Für guten Stil empfehle ich INNER JOIN zu verwenden. Außerdem fehlt dir ein Schutz vor unendlicher Rekursion... Ansonsten alles gut :)
 
Zurück
Oben