Tidak ada kueri SQL tunggal yang dapat memberikan Anda hasil yang dipesan seperti yang Anda harapkan berdasarkan struktur tabel ini.
Ada dua cara untuk menyelesaikan masalah:
-
Gunakan logika aplikasi eksternal (di luar DB) untuk membuat panggilan rekursif yang akan menemukan turunan dari setiap kategori dan membangun pohon dalam aplikasi.
-
Gunakan salah satu algoritme untuk menyimpan data pohon dalam basis data relasional. Salah satu algoritme tersebut disebut
Modified Preorder Tree Traversal
atau cukup MPTT.
Dengan asumsi kita menggunakan kolom lft
dan rgt
untuk mempertahankan indeks kiri / kanan dalam traversal, saat Anda memasukkan kategori baru, Anda perlu:
-
Dapatkan info kategori induk menurut Id:
SELECT lft,rgt FROM tbl_categories WHERE categoryId=5
Mari kita asumsikan sebagai contoh, bahwa kategori induk memilikilft=7
danrgt=10
(dalam hal ini sudah memiliki satu anak) -
Beri ruang untuk entri baru - geser semua catatan sebanyak 2 (1 untuk lft dan 1 untuk rgt):
UPDATE tbl_categories SET rgt=rgt+2 WHERE rgt>=10 ORDER BY rgt DESC
UPDATE tbl_categories SET lft=lft+2 WHERE lft>=10 ORDER BY lft DESC
Perhatikan di sini ORDER
menurun. Sebagai lft
dan rgt
seharusnya unik, disarankan untuk membuat UNIQUE
kendala pada mereka, dan kemudian urutan dalam pembaruan diperlukan untuk mencegah kesalahan kunci duplikat.
-
Setel
lft=<former parent rgt>
danrgt=<former parent rgt +1>
dan masukkan catatan baru...INSERT INTO tbl_categories SET categoryName="New Child",parentCategoryId=5,lft=11,rgt=12,...
Anda dapat menemukan contoh yang lebih rinci dengan kode jika Anda mencari MPTT PHP MySQL
. Ada beberapa tutorial tentang hal ini.