Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

मैं अपने नोड और उसके पूर्वजों के सभी भाई-बहनों को एक पदानुक्रमित श्रेणी के पेड़ में कैसे ढूंढ सकता हूं?

मुझे यकीन नहीं है कि मैं उन सभी का पालन करता हूं, लेकिन ऐसा लगता है कि आप श्रेणी 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 . के सभी वंशजों को भी लौटाएगा नोड. इसलिए यदि आप वर्तमान में "पोर्टेबल इलेक्ट्रॉनिक्स" देख रहे थे, तो क्वेरी अपने बच्चों को वापस कर देगी, लेकिन यह पोते "फ़्लैश" को भी वापस कर देगी, जो वह नहीं हो सकता जो आप चाहते हैं।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP और MySQL:लौटाई गई पंक्तियों की संख्या

  2. Mysql कैसे पंक्तियों को वापस करने के लिए भले ही डेटा में शामिल हों खाली है

  3. MySQL मित्र तालिका

  4. MYSQL में एक स्ट्रिंग का हिस्सा हटाना

  5. क्या मैं PHP के साथ MySQL चेतावनियों का पता लगा सकता हूं और उन्हें संभाल सकता हूं?