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

Bagaimana saya bisa menemukan semua saudara kandung ke simpul saya dan leluhurnya di pohon kategori hierarkis?

Saya tidak yakin saya mengikuti semua itu, tetapi sepertinya Anda ingin semua anak langsung dari kategori 5.

Berikut cara melakukannya:

SELECT child.*
FROM Category parent
  JOIN Category child 
    ON (child.lft BETWEEN parent.lft AND parent.rgt)
  LEFT JOIN Category intermediate 
    ON (intermediate.lft > parent.lft AND intermediate.rgt < parent.rgt
      AND child.lft > intermediate.lft AND child.rgt < intermediate.rgt)
WHERE intermediate.CategoryId IS NULL
  AND parent.CategoryId = ?;

edit: Oke, saya mengerti sekarang bahwa solusi di atas hanya sebagian dari apa yang Anda inginkan. Anda ingin:

  • Nenek moyang langsung pemutar CD
  • "Paman" pemutar CD (saudara leluhur)
  • Saudara dari pemutar CD
  • Anak-anak pemutar CD

Biarkan saya mengerjakannya selama beberapa menit.

Inilah yang saya dapatkan:

SELECT descendant.*,
  (current.lft BETWEEN descendant.lft AND descendant.rgt) AS is_selected,
  COUNT(DISTINCT c.CategoryId) AS depth
FROM Category current
JOIN Category selected 
  ON (current.lft BETWEEN selected.lft AND selected.rgt)
JOIN Category descendant 
  ON (descendant.lft BETWEEN selected.lft AND selected.rgt)
LEFT JOIN Category intermediate 
  ON (intermediate.lft > selected.lft AND intermediate.rgt < selected.rgt
    AND descendant.lft > intermediate.lft AND descendant.lft < intermediate.rgt)
JOIN Category c
  ON (descendant.lft BETWEEN c.lft AND c.rgt)
WHERE intermediate.CategoryId IS NULL
  AND current.CategoryId = ?
GROUP BY descendant.CategoryId
ORDER BY depth, descendant.name;
  • current adalah pemutar CD
  • selected adalah nenek moyang pemutar CD (elektronik, elektronik portabel, pemutar CD)
  • descendant apakah ada anak atau cucu, dll. dari setiap selected leluhur
  • intermediate adalah turunan dari setiap selected leluhur yang juga merupakan induk dari descendant -- tidak boleh ada salah satu dari ini, maka IS NULL pembatasan.
  • c adalah rantai nenek moyang dari descendant kembali ke atas, untuk tujuan menentukan kedalaman.

Saya baru menyadari bahwa solusi saya juga akan mengembalikan semua turunan current simpul. Jadi, jika Anda sedang melihat "elektronik portabel", kueri akan mengembalikan turunannya, tetapi juga akan mengembalikan "flash" cucu yang mungkin bukan yang Anda inginkan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tetapkan hasil variabel, dari kueri

  2. Encoding JSP saat memasukkan teks non-Inggris di database MySQL

  3. Permintaan untuk menemukan dan menghapus data duplikat dari tabel MYSql

  4. Periksa versi mySQL di Mac 10.8.5

  5. bergulir terus menerus. AJAX, PHP, JAVASCRIPT, MYSQL