कोई एकल SQL क्वेरी नहीं है जो इस तालिका संरचना के आधार पर आपकी अपेक्षा के अनुरूप परिणाम ला सकता है।
समस्या को हल करने के दो तरीके हैं:
-
पुनरावर्ती कॉल करने के लिए बाहरी एप्लिकेशन लॉजिक (DB के बाहर) का उपयोग करें जो प्रत्येक श्रेणी के बच्चों को खोजेगा और एप्लिकेशन में ट्री का निर्माण करेगा।
-
रिलेशनल डेटाबेस में ट्री डेटा को स्टोर करने के लिए एल्गोरिदम में से एक का उपयोग करें। ऐसे एल्गोरिदम में से एक को कहा जाता है। कोड>संशोधित प्रीऑर्डर ट्री ट्रैवर्सल या बस एमपीटीटी।
मान लें कि हम कॉलम का उपयोग करते हैं lft
और आरजीटी
ट्रैवर्सल में बाएँ / दाएँ अनुक्रमणिका बनाए रखने के लिए, जब आप एक नई श्रेणी सम्मिलित करते हैं तो आपको निम्न की आवश्यकता होगी:
-
आईडी के आधार पर मूल श्रेणी की जानकारी प्राप्त करें:
tbl_categories से चुनें lft, rgt जहां categoryId=5
उदाहरण के लिए मान लेते हैं कि मूल श्रेणी मेंlft=7
. था औरआरजीटी=10
(इस मामले में उसका पहले से ही एक बच्चा है) -
नई प्रविष्टि के लिए जगह बनाएं - सभी रिकॉर्ड्स को 2 से शिफ्ट करें (एलएफटी के लिए 1 और आरजीटी के लिए 1):
अद्यतन tbl_श्रेणियाँ SET rgt=rgt+2 जहाँ rgt>=10 rgt DESC द्वारा आदेश
अद्यतन tbl_श्रेणियाँ सेट करें lft=lft+2 जहाँ lft>=10 lft DESC द्वारा आदेश
यहां ध्यान दें आदेश
अवरोही। एलएफटी
. के रूप में और आरजीटी
अद्वितीय माना जाता है, इसे UNIQUE
. बनाने की सलाह दी जाती है उन पर प्रतिबंध, और फिर डुप्लिकेट कुंजी त्रुटियों को रोकने के लिए अद्यतन में अवरोही क्रम की आवश्यकता है।
-
सेट करें
एलएफटी=<पूर्व अभिभावक आरजीटी>
औरrgt=<पूर्व अभिभावक rgt +1>
और एक नया रिकॉर्ड डालें...INSERT INTO tbl_categories SET categoryName="नया चाइल्ड",parentCategoryId=5,lft=11,rgt=12,...
यदि आप MPTT PHP MySQL
. की खोज करते हैं तो आपको कोड के साथ अधिक विस्तृत उदाहरण मिल सकते हैं . इस विषय पर काफी कुछ ट्यूटोरियल हैं।