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!