Heim > Datenbank > MySQL-Tutorial > Wie finde ich alle Vorfahren eines Datensatzes in einer MySQL-Tabelle mithilfe einer einzigen rekursiven Abfrage?

Wie finde ich alle Vorfahren eines Datensatzes in einer MySQL-Tabelle mithilfe einer einzigen rekursiven Abfrage?

Linda Hamilton
Freigeben: 2024-12-08 07:31:11
Original
543 Leute haben es durchsucht

How to Find All Ancestors of a Record in a MySQL Table Using a Single Recursive Query?

Alle übergeordneten Elemente in einer MySQL-Tabelle mit einer einzigen rekursiven Abfrage finden

Betrachten Sie das folgende MySQL-Tabellenschema mit Beispieldaten:

| ID |             TITLE | CONTROLLER |            METHOD | PARENT_ID |
|----|-------------------|------------|-------------------|-----------|
|  1 |         Dashboard |      admin |         dashboard |         0 |
|  2 |           Content |      admin |           content |         0 |
|  3 |           Modules |      admin |           modules |         0 |
...
Nach dem Login kopieren

Herausforderung:

Unser Ziel ist um alle übergeordneten Elemente eines bestimmten Datensatzes zu finden, nämlich des mit Titel = „Kategorien“, mithilfe einer einzigen SQL-Abfrage.

Gewünschte Ausgabe:

id | title        |  controller  | method      | url     | parent_id 
----------------------------------------------------------------  
3  | Modules      |   admin      | modules     | (NULL)  | 0           
17 | User Modules |   modules    | user_module | (NULL)  | 3           
31 | Categories   |   categories | category    | (NULL)  | 17       
Nach dem Login kopieren

Lösung:

Wir verwenden einen rekursiven gemeinsamen Tabellenausdruck (CTE), um die Tabellenhierarchie zu durchlaufen und Identifizieren Sie alle Vorfahren des gewünschten Datensatzes:

WITH RECURSIVE Parents AS (
    SELECT id, parent_id
    FROM menu
    WHERE id = 31
    UNION ALL
    SELECT m.id, m.parent_id
    FROM Parents AS p
    JOIN menu AS m ON p.parent_id = m.id
)
SELECT m.id, m.title, m.controller, m.method, m.url, m.parent_id
FROM Parents AS p
JOIN menu AS m ON p.id = m.id
ORDER BY p.id DESC;
Nach dem Login kopieren

Erklärung:

  • Die CTE-Eltern werden mit der ID des Zieldatensatzes (31) initialisiert.
  • Der rekursive Teil der Abfrage wählt alle Eltern des aktuellen Datensatzes aus und setzt den fort Durchquerung.
  • Die ORDER BY-Klausel sortiert die Ergebnisse in absteigender Reihenfolge, wobei das unmittelbare übergeordnete Element zuerst erscheint.

Durch Ausführen dieser Abfrage erhalten wir die gewünschte Ausgabe und listen alle übergeordneten Elemente von auf den Kategoriendatensatz.

Das obige ist der detaillierte Inhalt vonWie finde ich alle Vorfahren eines Datensatzes in einer MySQL-Tabelle mithilfe einer einzigen rekursiven Abfrage?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage