जैसा कि टिप्पणियों में कहा गया है, mysql के साथ कोई छोटा रास्ता नहीं है।
लेकिन!
यदि आपके पास डेटाबेस संरचना को बदलने की संभावना है, तो आप पेड़ जैसी पदानुक्रमों को संभालने के लिए एक बेहतर डिज़ाइन को परिनियोजित कर सकते हैं।
अगर आप इस ट्यूटोरियल का अनुसरण करते हैं बिल कार्विन से (यहां मूल उत्तर है जो उस स्लाइड शो ट्यूटोरियल को संदर्भित करता है), आप एक पदानुक्रमित संरचना को मॉडल करने के लिए उपयोग की जाने वाली 4 विधियाँ पा सकते हैं:
- प्रवासियों की सूची
- पथ गणना
- नेस्टेड सेट
- क्लोजर टेबल
अब, सबसे अच्छा संभव मॉडल चौथा है (मैं पाठक के लिए अन्य 3 मॉडलों का विवरण छोड़ता हूं), जिसे मूल रूप से 2 तालिकाओं की आवश्यकता होती है:एक तत्वों के लिए और एक पथ के लिए। पाथ्स टेबल (क्लोजर टेबल ही) में, आप हर पथ को प्रत्येक नोड से हर वंशज (सिर्फ सीधे बच्चे के लिए नहीं!) को स्टोर करेंगे।
प्रत्येक पंक्ति के लिए पथ की लंबाई को भी बचाने का सुझाव दिया गया है, क्योंकि यह पेड़ में तत्काल बच्चों के लिए क्वेरी करना आसान बनाता है।
भले ही इस समाधान के लिए अधिक स्थान की आवश्यकता हो, इसका समग्र प्रदर्शन सबसे अच्छा है और इसका उपयोग करना वास्तव में आसान है:यह पुनरावर्ती प्रश्नों पर बिल्कुल भी निर्भर नहीं करता है और यह संपूर्ण डेटासेट के लिए संदर्भात्मक अखंडता प्रदान करेगा!
उदाहरण के लिए, नोड #4 के प्रत्येक बच्चे को प्राप्त करने के लिए:
select a.*
from nodes a
join paths b
on a.node_id = b.descendant
where b.ancestor = 4
एक और उदाहरण:नोड #11 के सभी पूर्वजों को प्राप्त करें
select a.*
from nodes a
join paths b
on a.node_id = b.ancestor
where b.descendant = 11
नोड #6 के सबट्री को हटाने की जरूरत है
delete from paths where descendant in
(select descendant from paths where ancestor = 6)