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

Menanyakan jumlah item dari pohon

Mengingat kendala tersebut, tidak ada cara. Dalam kasus seperti itu, Anda akan mengambil semua pohon dan membangun sisi klien 'bukit', atau melakukan kueri rekursif, apa pun yang paling berkinerja dalam kasus tertentu.

Dengan batasan tambahan memiliki jumlah tingkat hierarki yang tetap , Anda dapat melakukannya dengan beberapa GABUNG.

Dalam kasus umum, ada beberapa modifikasi struktur untuk mengatasi kendala tersebut. Dalam praktiknya, Anda mengendurkan batasan "INI adalah struktur tabel saya", memungkinkan penambahan bidang tambahan.

Misalnya, Anda dapat melengkapi struktur simpul dengan left_id value, dan pastikan semua ID node berurutan saat Anda mengunjungi tree depth-first:

1 --- 2 -+- 3 -+- 4
         |     |
         |     +- 5
         +- 6 --- 7

Dalam hal ini, simpul 3 akan menyimpan nilai "5", simpul 6 akan menyimpan nilai "7", dan simpul 2 akan menyimpan nilai "7" juga. Setiap node menyimpan di LeftID maksimum antara LeftID anak-anaknya dan ID-nya sendiri .

Jadi node tanpa anak memiliki LeftID sama dengan ID mereka. Node 1 akan memiliki LeftID 7 karena itu adalah LeftID dari 2, yang didapat dari 6.

Dalam situasi ini, menghitung node mudah jika tidak ada lubang dalam urutan; semua turunan dari sebuah node adalah node yang ID-nya berada di antara ID node awal dan LeftID-nya; dan daun diidentifikasi dengan memiliki LeftID sama dengan ID.

Jadi "semua daun yang turun dari simpul id 17" akan menjadi

SELECT child.*FROM table AS parentJOIN table AS childON (child.id> parent.id AND child.id <=parent.leftid ) /* Descendant /WHERE child.id =child.leftid / Daun /AND parent.id =17; / Orang tua berusia 17

Struktur ini sulit untuk dipertahankan jika Anda ingin dapat melakukan prune dan branch, karena Anda perlu memberi nomor ulang semua node antara titik prune hingga titik branch, serta node yang dipindahkan.

Kemungkinan lain jika Anda hanya tertarik untuk menghitung adalah dengan membuat penghitung anak. Ini dapat dipertahankan dengan memperbaruinya secara iteratif, memilih semua daun dan menyetel penghitungnya ke 0 (Anda mengidentifikasi daun melalui LEFT JOIN); kemudian semua orang tua dengan penghitung NULL yang memiliki anak dengan penghitung non-NULL, memperbarui penghitung mereka ke SUM() penghitung anak-anak ditambah COUNT() dari anak-anak itu sendiri; dan terus berlanjut hingga jumlah baris yang diperbarui menjadi nol, karena semua node memiliki penghitung non-NULL. Setelah memangkas-dan-cabang, Anda hanya mengatur semua penghitung ke NULL dan ulangi.

Pendekatan terakhir ini memerlukan gabungan reflektif untuk setiap tingkat hierarki.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Praktik terbaik bulk_create untuk catatan besar

  2. bagaimana cara membuat sistem penandaan menggunakan php dan mysql?

  3. Bagaimana cara menyimpan nilai FLOAT yang hilang dengan NULL di SQL

  4. MySQL Periksa apakah tabel ada kesalahan

  5. (1/1) MethodNotAllowedHttpException