Heim  >  Artikel  >  Datenbank  >  Wie frage ich eine Baumstruktur in MySQL rekursiv ab, um Nachkommen eines übergeordneten Knotens zu finden?

Wie frage ich eine Baumstruktur in MySQL rekursiv ab, um Nachkommen eines übergeordneten Knotens zu finden?

Susan Sarandon
Susan SarandonOriginal
2024-10-24 04:20:31510Durchsuche

How to Recursively Query a Tree Structure in MySQL to Find Descendants of a Parent Node?

Rekursion einer Baumstruktur in MySQL

Die Verwaltung hierarchischer Daten kann in relationalen Datenbanken eine Herausforderung sein, insbesondere wenn rekursive Abfragen erforderlich sind. In MySQL haben wir ein spezifisches Problem: Wie können alle Nachkommen eines bestimmten übergeordneten Standorts effizient abgerufen werden, unabhängig von der Tiefe der Hierarchie.

Das Problem:

Betrachten Sie das folgende Datenbankschema für Standorte:

location (id, ....)
location_parent (location_id, parent_id)

Die Standorttabelle speichert Standortinformationen, während die Tabelle „location_parent“ die Eltern-Kind-Beziehung zwischen Standorten definiert.

Angenommen, wir haben einen Standort mit ID 5. Wir möchten alle seine Nachkommen abrufen, einschließlich derjenigen, die mehrere Ebenen tief sind.

Erste Lösung:

Ein Ansatz für rekursive Abfragen ist die Verwendung einer selbst- Treten Sie wie folgt bei:

<code class="sql">SELECT DISTINCT l.id
FROM location AS l
LEFT JOIN location_parent AS lp ON l.id = lp.child_id
WHERE lp.parent_id = 5
;</code>

Diese Abfrage ruft die direkten Kinder von Standort 5 ab. Für tiefere Nachkommen müssen wir die Abfrage jedoch mehrmals wiederholen und jedes Mal die Ergebnisse der vorherigen Abfrage als verwenden Eingabe für den nächsten. Diese Methode ist ineffizient und für große hierarchische Strukturen unpraktisch.

Empfohlene Lösung:

Die empfohlene Lösung für dieses Problem ist die Verwendung des rekursiven Common Table Expression (CTE). Ein CTE ist eine temporäre Tabelle, die innerhalb einer einzigen Abfrage definiert und referenziert werden kann.

<code class="sql">WITH RECURSIVE descendants AS (
    SELECT id, parent_id
    FROM location_parent
    WHERE parent_id = 5
    UNION ALL
    SELECT lp.child_id, lp.parent_id
    FROM descendants AS d
    JOIN location_parent AS lp ON d.id = lp.parent_id
)
SELECT id
FROM descendants
;</code>

Diese Abfrage erstellt einen rekursiven CTE namens Nachkommen, der mit den direkten Kindern von Position 5 beginnt. Dann die UNION ALL-Klausel Fügt die Kinder der zuvor ausgewählten Nachkommen hinzu und erweitert die Abfrage so, dass sie alle Nachkommen in beliebiger Tiefe umfasst.

Der zweite Teil der Abfrage wählt die ID-Spalte aus dem CTE der Nachkommen aus, wodurch wir die Liste aller Nachkommen erhalten Standorte. Dieser Ansatz ist wesentlich effizienter als die Self-Join-Methode und kann hierarchische Strukturen beliebiger Tiefe verarbeiten.

Das obige ist der detaillierte Inhalt vonWie frage ich eine Baumstruktur in MySQL rekursiv ab, um Nachkommen eines übergeordneten Knotens zu finden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn