Heim  >  Artikel  >  Datenbank  >  Wie kann ich mit einer einzigen Abfrage alle Vorfahren eines Knotens in einer hierarchischen MySQL-Tabelle finden?

Wie kann ich mit einer einzigen Abfrage alle Vorfahren eines Knotens in einer hierarchischen MySQL-Tabelle finden?

Susan Sarandon
Susan SarandonOriginal
2024-11-26 18:29:11353Durchsuche

How Can I Find All Ancestors of a Node in a MySQL Hierarchical Table Using a Single Query?

Alle Eltern in einer MySQL-Tabelle mit einer einzigen Abfrage mithilfe eines rekursiven CTE finden

In einer Datenbank mit einer hierarchischen Struktur die Eltern identifizieren eines bestimmten Datensatzes kann eine komplexe Aufgabe sein. In MySQL kann diese Herausforderung mithilfe eines Recursive Common Table Expression (CTE) effizient angegangen werden. Lassen Sie uns die Problemstellung und ihre Lösung untersuchen.

Problemstellung:

Gegeben sei eine MySQL-Tabelle mit einer hierarchischen Struktur (wie die im bereitgestellten Schema), wo Jede Zeile stellt einen Knoten mit einer ID, einem Titel, einer übergeordneten ID und anderen relevanten Informationen dar. Die Aufgabe besteht darin, alle Vorfahren (übergeordneten Knoten) eines bestimmten Knotens in der Hierarchie mit einem einzigen abzurufen Abfrage.

Lösung:

Die bereitgestellte Lösung nutzt einen rekursiven CTE, um die Hierarchie zu durchqueren und die Eltern eines durch seine ID angegebenen Knotens zu identifizieren. Die folgende Abfrage veranschaulicht den Ansatz:

SELECT T2.id, T2.title, T2.controller, T2.method, T2.url
FROM (
    SELECT
        @r AS _id,
        (SELECT @r := parent_id FROM menu WHERE id = _id) AS parent_id,
        @l := @l + 1 AS lvl
    FROM
        (SELECT @r := 31, @l := 0) vars,
        menu m
    WHERE @r <> 0) T1
JOIN menu T2
ON T1._id = T2.id
ORDER BY T1.lvl DESC;

Abfrageerklärung:

  • Die Unterabfrage initialisiert zwei benutzerdefinierte Variablen, @r und @l, und wählt den angegebenen Datensatz mit der ID 31 aus (vorausgesetzt, es handelt sich um den Zielknoten). Diese Variablen werden verwendet, um die aktuelle Knoten-ID (@r) und die Ebene (@l) während der rekursiven Iteration zu verfolgen.
  • Der rekursive Teil des CTE ruft wiederholt die übergeordnete ID des aktuellen Knotens ab und erhöht die Ebene . Dieser Prozess wird fortgesetzt, bis der aktuelle Knoten keinen übergeordneten Knoten mehr hat (d. h. @r ist 0).
  • Die äußere Abfrage verbindet den rekursiven CTE mit der Haupttabelle (Menü) basierend auf der _id (Datensatz-ID), um den abzurufen Informationen für jeden Vorfahren.
  • Die ORDER BY-Klausel sortiert die Ergebnisse in absteigender Reihenfolge der Ebene, um die Vorfahren hierarchisch anzuzeigen Reihenfolge.

Diese Abfrage ruft effizient alle übergeordneten Knoten des angegebenen Knotens mit einer einzigen SQL-Anweisung ab und bietet so eine praktische und leistungsstarke Lösung für die Navigation hierarchischer Daten in MySQL.

Das obige ist der detaillierte Inhalt vonWie kann ich mit einer einzigen Abfrage alle Vorfahren eines Knotens in einer hierarchischen MySQL-Tabelle 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