मुझे यकीन नहीं है कि मैं उन सभी का पालन करता हूं, लेकिन ऐसा लगता है कि आप श्रेणी 5 के सभी तत्काल बच्चे चाहते हैं।
ऐसा करने का एक तरीका यह है:
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 = ?;
संपादित करें: ठीक है, अब मैं समझता हूं कि ऊपर दिया गया समाधान आप जो चाहते हैं उसका केवल एक हिस्सा है। आप चाहते हैं:
- सीडी प्लेयर के प्रत्यक्ष पूर्वज
- सीडी प्लेयर के "चाचा" (पूर्वजों के भाई-बहन)
- सीडी प्लेयर के भाई-बहन
- सीडी प्लेयर के बच्चे
मुझे उस पर कुछ मिनटों के लिए काम करने दें।
यहाँ मैं क्या लेकर आया हूँ:
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
सीडी प्लेयर हैselected
सीडी प्लेयर (इलेक्ट्रॉनिक्स, पोर्टेबल इलेक्ट्रॉनिक्स, सीडी प्लेयर) के पूर्वज हैंdescendant
क्या प्रत्येकselected
. का कोई बच्चा या पोता आदि है? पूर्वजintermediate
प्रत्येकselected
. का वंशज है पूर्वज जोdescendant
. का जनक भी है -- इनमें से कोई भी नहीं होना चाहिए, इसलिएIS NULL
प्रतिबंध।c
descendant
. से पूर्वजों की श्रृंखला है गहराई निर्धारित करने के उद्देश्य से शीर्ष पर वापस जाएं।
मुझे अभी एहसास हुआ कि मेरा समाधान current
. के सभी वंशजों को भी लौटाएगा नोड. इसलिए यदि आप वर्तमान में "पोर्टेबल इलेक्ट्रॉनिक्स" देख रहे थे, तो क्वेरी अपने बच्चों को वापस कर देगी, लेकिन यह पोते "फ़्लैश" को भी वापस कर देगी, जो वह नहीं हो सकता जो आप चाहते हैं।