Abfrage zum abrufen von übergeordneten Datensätzen mit untergeordneten Datensatz, gefolgt von den nächsten Eltern-Kind-Datensätzen in mysql
Habe ich die Daten im folgenden format in die Names
Tabelle in der Datenbank:
ID | Name | ParentID
1 | Parent 1 | 0
2 | Parent 2 | 0
3 | Parent 1 Child 1 | 1
4 | Parent 2 Child 1 | 2
5 | Parent 1 Child 1 Child | 3
6 | Parent 2 Child 1 Child 1 | 4
7 | Parent 2 Child 1 Child 2 | 4
Den ParentID
Spalte wird mit Daten aus ID
Spalte als übergeordneter Datensatz. ParentID
mit 0
Wert gibt an root-Elemente. Ich muss eine Abfrage schreiben, um Daten in der folgenden Reihenfolge:
ID | Name | ParentID
1 | Parent 1 | 0
3 | Parent 1 Child 1 | 1
5 | Parent 1 Child 1 Child | 3
2 | Parent 2 | 0
4 | Parent 2 Child 1 | 2
6 | Parent 2 Child 1 Child 1 | 4
7 | Parent 2 Child 1 Child 2 | 4
Ich brauche, um das root-Datensatz(Datensatz mit ParentID
0) gefolgt von allen child
und sub-children
dieses root-Datensatz und dann kommt der nächste root-Datensatz, gefolgt von child
und sub-children
von der root-Datensatz und so weiter.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Lösung, die ich vorschlagen, hier greift das Konzept der materialized path. Der folgende Code ist ein Beispiel der materialisierte Pfade unter Verwendung von Beispieldaten. Ich hoffe, es hilft dir zu verstehen, materialized path-Konzept:
Jeder Knoten
N
hat eine materialisierte Pfad dieser Pfad gibt den Weg zu gehen vom root-Knoten zum KnotenN
. Es kann sein, bauen die Verkettung der Knoten-id ist. Zum Beispiel, zu erreichen, um Knoten5
ausgehend von der Wurzel die Knoten, die Sie besuchen, Knoten1
Knoten3
und Knoten5
, also Knoten5
materialized path1.3.5
Zufällig, die Reihenfolge, die Sie suchen erreicht werden kann die Bestellung von der materialized path.
Auf dem vorherigen Beispiel, materialisierte Pfade sind buit Verkettung von strings, aber ich bevorzuge binäre Verkettung für eine Reihe von Gründen.
Bauen die materialisierte Pfade müssen Sie die folgenden rekursiven CTE:
Ergebnis:
Den oben genannten rekursiven CTE beginnt mit dem root-Knoten. Die Berechnung der materialized path für root-Knoten ist trivial einfach, es ist die ID des Knotens selbst. Auf der nächsten iteration der CTE schließt root-nodes mit child nodes. Die materialisierte Weg für ein Kind-Knoten
CN
ist die Verkettung der materialisierten Pfad des übergeordneten KnotensPN
und der id des KnotensCN
. Nachfolgende Iterationen Voraus eine Ebene nach unten auf dem Baum, bis die Blattknoten erreicht sind.