Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Permintaan MySQL yang mengembalikan pohon kategori

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:

  1. Gunakan logika aplikasi eksternal (di luar DB) untuk membuat panggilan rekursif yang akan menemukan turunan dari setiap kategori dan membangun pohon dalam aplikasi.

  2. 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:

  1. Dapatkan info kategori induk menurut Id:SELECT lft,rgt FROM tbl_categories WHERE categoryId=5 Mari kita asumsikan sebagai contoh, bahwa kategori induk memiliki lft=7 dan rgt=10 (dalam hal ini sudah memiliki satu anak)

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

  1. Setel lft=<former parent rgt> dan rgt=<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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Konfigurasi MySQL yang optimal (my.cnf)

  2. Cara mereset kata sandi root MySQL

  3. Mysqli bergabung dengan tabel dari 2 database yang berbeda

  4. Contoh MySQL REGEXP

  5. Bagaimana saya bisa membuat kumpulan koneksi mysql menggunakan alat asadmin di server GlassFish?