Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Cari Semua Entri Ibu Bapa dalam Jadual MySQL Menggunakan Pertanyaan Rekursif Tunggal?

Bagaimana untuk Cari Semua Entri Ibu Bapa dalam Jadual MySQL Menggunakan Pertanyaan Rekursif Tunggal?

DDD
DDDasal
2024-11-30 19:23:15204semak imbas

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

Mencari Semua Ibu Bapa dalam Jadual MySQL dengan Pertanyaan Tunggal (Pertanyaan Rekursif)

Jadual seperti menu atau kategori selalunya mempunyai struktur hierarki di mana entri berada berkaitan antara satu sama lain melalui hubungan ibu bapa-anak. Dalam senario sedemikian, mendapatkan semula semua ibu bapa entri tertentu boleh menjadi satu cabaran, terutamanya apabila cuba berbuat demikian dengan satu pertanyaan.

Pertimbangkan skema berikut yang mengandungi entri menu:

| 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 |

Matlamatnya adalah untuk mencari semua ibu bapa entri dengan ID 31 (Kategori) menggunakan satu pertanyaan. Untuk mencapai matlamat ini, kami boleh menggunakan pertanyaan rekursif:

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;

Pertanyaan ini menggunakan ungkapan jadual biasa (CTE) untuk mendapatkan semula ibu bapa entri secara berulang. Subquery vars memulakan pembolehubah @r dan @l, yang masing-masing mewakili ID entri semasa dan tahap rekursi. Subkueri utama, T1, kemudian menggunakan pertanyaan rekursif untuk mencari induk entri semasa sambil meningkatkan tahap.

Akhir sekali, T1 CTE dicantumkan dengan jadual menu, T2, untuk mendapatkan butiran setiap kemasukan ibu bapa. Klausa ORDER BY T1.lvl DESC menyusun keputusan dalam tertib menurun tahap, memastikan ibu bapa terdekat ditunjukkan dahulu.

Menggunakan pertanyaan rekursif ini, kita boleh mendapatkan output yang diingini berikut:

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       

Atas ialah kandungan terperinci Bagaimana untuk Cari Semua Entri Ibu Bapa dalam Jadual MySQL Menggunakan Pertanyaan Rekursif Tunggal?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn