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

MySQL - Ist es möglich, alle Unterelemente in einer Hierarchie zu erhalten?

Dies ist einfach nur ein Adjazenzmodell Tisch? Dann ist eine Abfrage ohne Kenntnis der maximalen Tiefe nicht möglich.

Denkanstoß ist Managing Hierarchical Data in MySQL (obwohl ich die Verwendung des Nested Set Model nicht befürworte für Daten, die sich regelmäßig ändern).

Mit vielen (Left-)Joins, genauer gesagt:mit so vielen Left-Joins wie die maximale Tiefe des Baums, wird es in einer Abfrage möglich sein. Das ist der Grund, warum viele Leute dazu neigen, die 'Tiefe' einer bestimmten Kategorie zu speichern, damit Sie die Anzahl der Joins derselben Tabelle filtern und auf eine vernünftigere Menge begrenzen können.

Persönlich, zum regelmäßigen Ändern von Daten:Ich neige dazu, einen Trigger für eine Einfügung / Aktualisierung zu konfigurieren, der den aktuellen "Pfad" eines Knotens basierend auf IDs speichert / zwischenspeichert (zum Beispiel:Ein Pfad ist "12/62/28/345 ', wobei jeder Schritt zwischen dem Trennzeichen / ist der Primärschlüssel eines übergeordneten Knotens in der richtigen Reihenfolge (der übergeordnete Knoten von 345 ist 28, der übergeordnete Knoten von 28 ist 62 usw.), sodass ich ihn mit nur einem Join wie folgt abfragen kann (/ wird als Trennzeichen verwendet):

SELECT j.*
FROM tablename o
JOIN tablename j
WHERE j.path LIKE CONCAT (o.path,'/%')
AND  j.id != o.id  -- skip parent asked for.
WHERE o.id = <the id of the node you're looking for>;