Heim >Datenbank >MySQL-Tutorial >Wie finde ich alle übergeordneten Einträge in einer MySQL-Tabelle mithilfe einer einzigen rekursiven Abfrage?
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!