Heim >Datenbank >MySQL-Tutorial >Wie finde ich alle übergeordneten Einträge in einer MySQL-Tabelle mithilfe einer einzigen rekursiven Abfrage?

Wie finde ich alle übergeordneten Einträge in einer MySQL-Tabelle mithilfe einer einzigen rekursiven Abfrage?

DDD
DDDOriginal
2024-11-30 19:23:15211Durchsuche

How to Find All Parent Entries in a MySQL Table Using a Single Recursive Query?

Alle übergeordneten Elemente in einer MySQL-Tabelle mit einer einzigen Abfrage finden (rekursive Abfrage)

Tabellen wie Menüs oder Kategorien haben oft hierarchische Strukturen, in denen sich Einträge befinden sind über eine Eltern-Kind-Beziehung miteinander verbunden. In solchen Szenarien kann das Abrufen aller übergeordneten Elemente eines bestimmten Eintrags zu einer Herausforderung werden, insbesondere wenn dies mit einer einzigen Abfrage versucht wird.

Berücksichtigen Sie das folgende Schema mit Menüeinträgen:

| ID |             TITLE | CONTROLLER |            METHOD | PARENT_ID |
|----|-------------------|------------|-------------------|-----------|
|  1 |         Dashboard |      admin |         dashboard |         0 |
|  2 |           Content |      admin |           content |         0 |
|  3 |           Modules |      admin |           modules |         0 |
|  4 |             Users |      admin |             users |         0 |
|  5 |          Settings |      admin |          settings |         0 |
|  6 |           Reports |      admin |           reports |         0 |
|  7 |              Help |      admin |              help |         0 |
|  8 |             Pages |    content |             pages |         2 |
|  9 |             Media |    content |             media |         2 |
| 10 |          Articles |    content |          articles |         2 |
| 11 |            Menues |    content |            menues |         2 |
| 12 |         Templates |    content |         templates |         2 |
| 13 |            Themes |    content |            themes |         2 |
| 14 |              Blog |    content |              blog |         2 |
| 15 |             Forum |    content |             forum |         2 |
| 16 |      Core Modules |    modules |       core_module |         3 |
| 17 |      User Modules |    modules |       user_module |         3 |
| 18 |         All Users |      users |         all_users |         4 |
| 19 |            Groups |      users |            groups |         4 |
| 20 |       Permissions |      users |       permissions |         4 |
| 21 | Import and Export |      users |     import_export |         4 |
| 22 |        Send Email |      users |         send_mail |         4 |
| 23 |     Login Records |      users |     login_records |         4 |
| 24 |  General Settings |   settings |  general_settings |         5 |
| 25 |    Email Settings |   settings |    email_settings |         5 |
| 26 |   Popular Content |    reports |   popular_content |         6 |
| 27 | Most Active Users |    reports | most_active_users |         6 |
| 28 |     Documentation |       help |     documentation |         7 |
| 29 |             About |       help |             about |         7 |
| 30 |          Products |   products |           product |        17 |
| 31 |        Categories | categories |          category |        17 |

Ziel ist es, mit einer einzigen Abfrage alle übergeordneten Elemente eines Eintrags mit der ID 31 (Kategorien) zu finden. Um dies zu erreichen, können wir eine rekursive Abfrage verwenden:

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;

Diese Abfrage verwendet einen allgemeinen Tabellenausdruck (CTE), um die übergeordneten Elemente eines Eintrags iterativ abzurufen. Die Unterabfrage vars initialisiert die Variablen @r und @l, die die ID des aktuellen Eintrags bzw. die Ebene der Rekursion darstellen. Die Hauptunterabfrage T1 verwendet dann eine rekursive Abfrage, um das übergeordnete Element des aktuellen Eintrags zu finden und gleichzeitig die Ebene zu erhöhen.

Schließlich wird der T1-CTE mit der Menütabelle T2 verknüpft, um die Details jedes Eintrags abzurufen übergeordneter Eintrag. Die ORDER BY T1.lvl DESC-Klausel ordnet die Ergebnisse in absteigender Reihenfolge der Ebene und stellt sicher, dass die nächstgelegenen übergeordneten Elemente zuerst angezeigt werden.

Mit dieser rekursiven Abfrage können wir die folgende gewünschte Ausgabe erhalten:

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       

Das obige ist der detaillierte Inhalt vonWie finde ich alle übergeordneten Einträge in einer MySQL-Tabelle mithilfe einer einzigen rekursiven Abfrage?. 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