Um hierarchische Abfragen in MySQL zu erstellen, müssen Sie verstehen, wie Hierarchien aufgebaut sind. Betrachten Sie die folgende Beispieltabelle:
id | 名称 | 父ID |
---|---|---|
19 | 类别1 | 0 |
20 | 类别2 | 19 |
21 | 类别3 | 20 |
22 | 类别4 | 21 |
In dieser Tabelle stellt die Spalte parent_id
die ID der übergeordneten Kategorie einer bestimmten Kategorie dar. Kategorie 2 hat beispielsweise einen parent_id
von 19, was darauf hinweist, dass es sich um eine Unterkategorie von Kategorie 1 handelt.
Für MySQL 8 und höher können Sie die rekursive WITH-Syntax verwenden:
<code class="language-sql">WITH RECURSIVE cte (id, name, parent_id) AS ( SELECT id, name, parent_id FROM products WHERE parent_id = 19 UNION ALL SELECT p.id, p.name, p.parent_id FROM products p INNER JOIN cte ON p.parent_id = cte.id ) SELECT * FROM cte;</code>
Diese Abfrage ruft rekursiv alle untergeordneten Kategorien für eine bestimmte übergeordnete ID ab (19 in diesem Beispiel). Die Ausgabe umfasst alle Kategorien, die direkt oder indirekt zur Kategorie 1 (id=19) gehören.
Für ältere MySQL-Versionen (5.x) gibt es zwei Alternativen:
Inline-Variablen:
<code class="language-sql">SELECT id, name, parent_id FROM (SELECT * FROM products ORDER BY parent_id, id) products_sorted, (SELECT @pv := '19') initialisation WHERE FIND_IN_SET(parent_id, @pv) AND LENGTH(@pv := CONCAT(@pv, ',', id));</code>
Diese Abfrage nutzt die spezifischen Funktionen von MySQL, um während der Ausführung Variablen zuzuweisen und zu ändern. Indem wir die Variable @pv
mit der übergeordneten ID (in diesem Fall 19) initialisieren und mit der Funktion FIND_IN_SET
prüfen, ob parent_id
in der Nachkommenliste erscheint, können wir die Liste der Nachkommen-IDs inkrementell erstellen.
Selbstverbindung:
<code class="language-sql">SELECT DISTINCT child.id, child.name, child.parent_id FROM products AS child JOIN products AS parent ON child.parent_id = parent.id WHERE parent.id = 19;</code>
Diese Abfrage durchläuft die Hierarchie beginnend bei der angegebenen übergeordneten ID (19) mithilfe eines Selbst-Joins. Indem wir die untergeordnete Tabelle mit der übergeordneten Tabelle basierend auf der Spalte parent_id
verbinden, können wir alle Nachkommen eines bestimmten übergeordneten Elements rekursiv extrahieren.
Das obige ist der detaillierte Inhalt vonWie erstelle ich hierarchische rekursive Abfragen in MySQL?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!