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 CDselected
adalah nenek moyang pemutar CD (elektronik, elektronik portabel, pemutar CD)descendant
apakah ada anak atau cucu, dll. dari setiapselected
leluhurintermediate
adalah turunan dari setiapselected
leluhur yang juga merupakan induk daridescendant
-- tidak boleh ada salah satu dari ini, makaIS NULL
pembatasan.c
adalah rantai nenek moyang daridescendant
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.