Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Gibt es in MySQL eine „connect by“-Alternative?

Wie in den Kommentaren gesagt, gibt es mit mysql keinen kurzen Weg.

ABER!

Wenn Sie die Möglichkeit haben, die Datenbankstruktur zu ändern, können Sie ein besseres Design einsetzen, um baumartige Hierarchien zu handhaben.

Wenn Sie DIESEM TUTORIAL folgen von Bill Karwin (HIER ). ist die ursprüngliche Antwort, die auf dieses Diashow-Tutorial verweist), finden Sie 4 Methoden zum Modellieren einer hierarchischen Struktur:

  1. Adiazenzliste
  2. Pfadaufzählung
  3. Verschachtelte Sätze
  4. Abschlusstabelle

Nun, das bestmögliche Modell ist das 4. (Beschreibungen der anderen 3 Modelle überlasse ich dem Leser), das im Grunde 2 Tabellen benötigt:eine für die Elemente und eine für die Pfade. In der Pfadtabelle (der Closure-Tabelle selbst) speichern Sie jeden Pfad von jedem Knoten zu jedem Nachfolger (nicht nur die direkten Kinder!).

Es wird empfohlen, auch die Pfadlänge für jede Zeile zu speichern, da dies die Suche nach unmittelbar untergeordneten Elementen im Baum erleichtert.

Auch wenn diese Lösung mehr Speicherplatz benötigt, hat sie die beste Gesamtleistung und ist wirklich einfach zu verwenden:Sie verlässt sich überhaupt nicht auf rekursive Abfragen UND gewährt referenzielle Integrität für den gesamten Datensatz!

Um beispielsweise jedes Kind des Knotens #4 zu erhalten:

select a.*
from nodes a
join paths b
on a.node_id = b.descendant
where b.ancestor = 4

Ein weiteres Beispiel:Holen Sie sich alle Vorfahren des Knotens #11

select a.*
from nodes a
join paths b
on a.node_id = b.ancestor
where b.descendant = 11

müssen den Teilbaum des Knotens #6

löschen
delete from paths where descendant in
(select descendant from paths where ancestor = 6)