इस लेख का संदर्भ लें: Managing Hierarchical Data in MySQL।
असल में, उन्होंने बिना किसी रिकर्सन के पदानुक्रमित डेटा प्राप्त करने के लिए मॉडल का इरादा किया है। उसमें वे तालिका की संरचनात्मक जानकारी संग्रहीत करने के लिए अतिरिक्त कॉलम पर Lft (बाएं) और आरजीटी (दाएं) का उपयोग करते हैं। एलएफटी और आरजीटी
रूट लफ्ट 1 है। तो इसका पहला बच्चा एलएफटी अगले नंबर पर है और उसके बच्चे को अगले नंबर पर तब तक कोई बच्चा नहीं है जब उस नोड (पत्ता नोड) के लिए आरजीटी उसकी एलएफटी होगी +1। और हम siblings lft को rgt +1 के रूप में सेट करेंगे और इसके लिए भी उसी नियम का पालन करेंगे।
और यदि सभी बच्चे की संख्या पूरी की जाती है तो यह माता-पिता को अंतिम बच्चे के आरजीटी +1 पर सेट करेगा।
मैंने इसे अच्छी तरह से समझाया नहीं है लेकिन छवि के लिंक पर यह समझना आसान है। किसी भी डालने के लिए
LOCK TABLE article WRITE;
SELECT @myLeft := lft, @myRight := rgt, @myWidth := rgt - lft + 1
FROM article WHERE category_id = 'row_id';
DELETE FROM article WHERE lft BETWEEN @myLeft AND @myRight;
UPDATE article SET rgt = rgt - @myWidth WHERE rgt > @myRight;
UPDATE article SET lft = lft - @myWidth WHERE lft > @myRight;
UNLOCK TABLES;
: किसी भी पंक्ति को हटाने के लिए
SELECT parent.category_id
FROM article AS node,
article AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND node.category_id = $category_id
ORDER BY parent.lft;
:
तो इस के बाद आप आसानी से आंतरिक संरचना निम्नलिखित प्रश्नों
का उपयोग कर आदेश में सभी माता-पिता की पहचान हो रही है के लिए तलाश कर सकते हैं पंक्ति:
LOCK TABLE article WRITE;
SELECT @myLeft := lft FROM article WHERE category_id = 'parent_id';
UPDATE article SET rgt = rgt + 2 WHERE rgt > @myLeft;
UPDATE article SET lft = lft + 2 WHERE lft > @myLeft;
INSERT INTO article(title, lft, rgt) VALUES('title', @myLeft + 1, @myLeft + 2);
UNLOCK TABLES;
यह कुछ जटिल है, लेकिन संग्रहीत प्रक्रिया बनाने के बाद, इसका उपयोग करना मुश्किल नहीं होगा।
साझा करने के लिए धन्यवाद .. hierarchyid कोशिश यह लेख hierarachy के 4 स्तर के लिए क्वेरी दे। यहां पदानुक्रम का अधिकतम स्तर अलग-अलग 'category_id' के लिए अज्ञात हो सकता है। – Vin