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
Lepaskan: 2024-11-30 19:23:15
asal
201 orang telah melayarinya

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 |
Salin selepas log masuk

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;
Salin selepas log masuk

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       
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan