mysql - with - Abrufen von Hierarchiedaten aus selbstreferenzierenden Tabellen




sql hierarchy query (4)

Nehmen wir an, Sie haben die folgende Tabelle:

items(item_id, item_parent)  

... und es handelt sich um eine selbstreferenzierende Tabelle - item_parent bezieht sich auf item_id .

Mit welcher SQL-Abfrage würden Sie alle Elemente in der Tabelle zusammen mit ihrer Tiefe auswählen, wobei die Tiefe eines Elements die Summe aller Eltern und Großeltern dieses Elements ist.

Wenn Folgendes der Inhalt der Tabelle ist:

item_id     item_parent
----------- -----------
1           0          
2           0            
3           2          
4           2          
5           3          

... die Abfrage sollte die folgenden Objektmengen abrufen:

{"item_id": 1, "Tiefe": 0}
{"item_id": 2, "Tiefe": 0}
{"item_id": 3, "Tiefe": 1}
{"item_id": 4, "Tiefe": 1}
{"item_id": 5, "Tiefe": 2}

PS Ich suche nach einem von MySQL unterstützten Ansatz.


Es gibt einen guten technischen Artikel auf der MySQL- Website über hierarchische Daten in MySQL: Hierarchische Daten in MySQL verwalten - Sie können dort einige detaillierte Lösungen mit Vor- und Nachteilen finden.

Besonders der Teil über "Das verschachtelte Set-Modell" und "Die Tiefe der Knoten finden" dürfte für Sie von Interesse sein.



Oracle hat eine sehr praktische Syntax zum Abrufen von hierarchischen Daten wie folgt:

select
    item_id,
    item_parent,
    level as depth
from
    items
connect by
    prior item_id = item_parent
start with
    item_parent not in (select item_id from items)

Dies beginnt mit den Stammknoten Ihrer Bäume als denjenigen Elementen, deren item_parent in der Tabelle nicht als item_id vorhanden ist, und wählt alle untergeordneten Elemente dieser Knoten sowie deren Tiefe in der Struktur aus.


Wenn die Datenbank SQL 2005/2008 ist, dann ...

Der einfachste Weg, dies zu erreichen, ist die Verwendung eines CTE (Common Table Expression), der rekursiv ist.

 WITH myCTE (Item_id, Depth)
 AS
 (
    Select Item_ID, 0 as Depth From yourTable where Item_Parent=0
    Union ALL
    Select yourTable.Item_ID, Depth + 1 
    From yourTable 
    inner join myCte on yourTable.item_Parent = myCte.Item_Id
 )

 Select Item_id, Depth from myCTE

Die Ausgabe ist wie folgt:

Item_Id  Depth
    1   0
    2   0
    3   1
    4   1
    5   2

Von diesem können Sie es wie gewünscht formatieren.





hierarchy