Heim  >  Artikel  >  Datenbank  >  Wie rufe ich alle Nachkommen in einer MySQL-Baumstruktur rekursiv ab?

Wie rufe ich alle Nachkommen in einer MySQL-Baumstruktur rekursiv ab?

DDD
DDDOriginal
2024-10-23 19:45:30509Durchsuche

How to Recursively Retrieve All Descendants in a MySQL Tree Structure?

Rekursion einer Baumstruktur in MySQL

Die Verwaltung hierarchischer Daten in einer Datenbank kann eine Herausforderung sein. Ein gängiger Ansatz besteht darin, eine Eltern-Kind-Beziehung zu verwenden, wie in der bereitgestellten Frage gezeigt. Während die Abfrage nach unmittelbaren Nachkommen unkompliziert ist, kann das Abrufen aller Nachkommen komplexer sein.

Die MySQL-Dokumentation schlägt mehrere Methoden zum Umgang mit hierarchischen Daten vor, darunter die folgenden:

  • Pfad Aufzählung: Bei dieser Methode wird der Pfad von jedem Knoten zur Wurzel des Baums in einer Datenbankspalte gespeichert. Abfragen können diese Spalte dann zum effizienten Abrufen von Nachkommen verwenden.
  • Angrenzende Liste: Dieser Ansatz speichert die Eltern-Kind-Beziehungen in einer einzelnen Tabelle, wobei jede Zeile einen Knoten und seinen direkten übergeordneten Knoten darstellt. Obwohl die Implementierung einfach ist, sind mehrere Abfragen erforderlich, um alle Nachkommen abzurufen.
  • Verschachtelte Mengen: Diese fortgeschrittenere Methode verwendet ein Spaltenpaar, um die linke und rechte Position jedes Knotens innerhalb zu speichern Baum. Es bietet einen effizienten Abruf von Nachkommen, erfordert jedoch komplexere Tabellenaktualisierungen.

Für das gegebene Beispiel würde die folgende Abfrage unter Verwendung der Pfadaufzählungsmethode alle Nachkommen eines übergeordneten Standorts abrufen:

WITH RECURSIVE descendant_path AS (
  SELECT id, path
  FROM locations
  WHERE id IN (SELECT location_id FROM location_parent WHERE parent_id = '$locationid')
  UNION ALL
  SELECT l.id, CONCAT(dp.path, ',', l.id)
  FROM locations l
  JOIN descendant_path dp ON l.path LIKE CONCAT(dp.path, '%')
)
SELECT id FROM descendant_path;

Diese Abfrage verwendet einen rekursiven CTE (Common Table Expression), um die Baumstruktur zu durchlaufen und einen Pfad für jeden untergeordneten Standort zu erstellen. Durch Angabe des Startorts in der ersten Abfrage können alle Nachkommen in einem einzigen Durchgang abgerufen werden.

Das obige ist der detaillierte Inhalt vonWie rufe ich alle Nachkommen in einer MySQL-Baumstruktur rekursiv ab?. 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