2012-07-12 15 views
6

देता है मैं श्रेणी प्रबंधन पर काम कर रहा हूं। जहां मैं प्रत्येक पंक्ति के साथ parentId है। श्रेणियां एन-स्तर हो सकती हैं। मैं फिर से php फ़ंक्शन को कॉल कर सकता हूं जो श्रेणी वृक्ष सरणी वापस कर देगा।MySQL क्वेरी जो श्रेणी पेड़

enter image description here

अब मुद्दा है: व्यवस्थापक पैनल में मैं जैसा कि नीचे दिखाया चाहते श्रेणी सूची पेज। यानी किस श्रेणी में है।

  • होम
  • उत्पादों (संपादित) (हटाएँ)
  • उत्पाद> उत्पाद 1 (संपादित) (हटाएँ)
  • उत्पाद> उत्पाद 2 (संपादित) (हटाएँ)
  • उत्पाद> उत्पाद 2 > उत्पाद 2 1 (संपादित करें) (हटाएँ)
  • उत्पाद> उत्पाद 2> उत्पाद 2 2 (संपादित) (हटाएँ)
  • हमसे संपर्क करें (संपादित करें) (हटाएँ)

मैं ऊपर दिखाए गए अनुसार उसी क्रम में mysql क्वेरी परिणाम चाहता हूं। मुझे यकीन नहीं है कि मैं इसे कैसे प्राप्त कर सकता हूं।

SELECT * 
FROM tbl_categories 
ORDER BY ??? 

कृपया गाइड करें।

+0

बेहतर उपयोग। – Oyeme

+0

यह प्रोग्रामिंग के साथ काम कर रहा है। लिस्टिंग में पेजिंग हो सकती है, मैं उस क्वेरी के साथ सीमा का उपयोग करना चाहता हूं। शॉपिंग कार्ट ओपनसोर्स में कहीं मैंने देखा है, लेकिन मुझे याद नहीं है कि उन्होंने कैसे किया है। – VibhaJ

+0

कृपया हमें टेबल संरचना दिखाएं, यानी कहें, मैं चाहता हूं कि 2 पंक्ति प्राप्त करें उत्पाद 2.1 –

उत्तर

0

आप इसे एक एकल MySQL क्वेरी में प्राप्त नहीं कर सकते हैं। अच्छी तरह से आप कई प्रश्नों को निष्पादित करके इसे प्राप्त कर सकते हैं। एल्गोरिदम इस तरह से चला जाता है: प्रारंभ में डेटा बेस से डेटा लाने के द्वारा, डेटा सेट ऑब्जेक्ट बनाएं जिसे आप पॉप्युलेट करेंगे। एक विधि बनाएं जो पैरेंट आईडी को पैरामीटर के रूप में लेती है और यदि मौजूद हो तो उसके बच्चे नोड्स लौटाती है, और यदि रिटर्न -1 है, तो उसके पास कोई बच्चा नहीं है। चरण 1: सभी पंक्तियां प्राप्त करें, जिनमें अभिभावक (रूट) नोड नहीं है। चरण 2: इस परिणाम के माध्यम से Iterate। उदाहरण के लिए यदि prod1 और prod2 परिणामस्वरूप प्रारंभिक लौटा नोड्स हैं। इस आरएस को इटरेट करना हम prod1 प्राप्त करते हैं, और हम अपने डेटाएसईटी ओबीजे में एक पंक्ति डालते हैं। फिर हम अपने बच्चे को पाने के लिए getCHILD विधि प्राप्त करने के लिए prod1 की आईडी भेजते हैं, और फिर फिर से हम वापस किए गए परिणाम को फिर से चालू करते हैं, और फिर तक getCHILD विधि को कॉल करते हैं, जब तक कि हम निम्नतम नोड प्राप्त न करें।

2

कोई एकल SQL क्वेरी है जो आपको इस तालिका संरचना के आधार पर अपेक्षाकृत परिणाम देने का आदेश दे सकता है।

  1. उपयोग बाहरी अनुप्रयोग तर्क (DB के बाहर) कि प्रत्येक श्रेणी के बच्चों को खोजने और उनके आवेदन में पेड़ का निर्माण करेगा पुनरावर्ती कॉल करने के लिए:

    वहाँ मुद्दे के हल के लिए दो तरीके हैं।

  2. एक संबंधपरक डेटाबेस में पेड़ डेटा संग्रहीत करने के लिए एल्गोरिदम का उपयोग करें। ऐसे एल्गोरिदम में से एक को Modified Preorder Tree Traversal या बस एमपीटीटी कहा जाता है।ईद से

    1. प्राप्त जनक श्रेणी की जानकारी:

    मानते हुए हम ट्रेवर्सल में बायीं/दायीं अनुक्रमित बनाए रखने के लिए कॉलम lft और rgt का उपयोग करें, जब आप एक नया वर्ग सम्मिलित आप की आवश्यकता होगी SELECT lft,rgt FROM tbl_categories WHERE categoryId=5 उदाहरण के लिए मान लीजिए कि मूल श्रेणी में lft=7 और rgt=10 (इस मामले में इसमें पहले से ही एक बच्चा है)

  3. एम एक नई प्रविष्टि के लिए शॉट लें कमरा - (rgt के लिए एलएफटी के लिए 1 और 1) द्वारा 2 सभी रिकॉर्ड पारी:

    UPDATE tbl_categories SET rgt=rgt+2 WHERE rgt>=10 ORDER BY rgt DESC

    UPDATE tbl_categories SET lft=lft+2 WHERE lft>=10 ORDER BY lft DESC

नोट यहाँ ORDER उतरते। lft और rgt अद्वितीय होने के लिए माना जाता है, इसलिए उन्हें UNIQUE बाधा बनाने की सलाह दी जाती है, और फिर डुप्लिकेट कुंजी त्रुटियों को रोकने के लिए अद्यतन में अवरोही क्रम की आवश्यकता होती है।

  1. सेट lft=<former parent rgt> और rgt=<former parent rgt +1> और एक नया रिकार्ड डालने ...

    INSERT INTO tbl_categories SET categoryName="New Child",parentCategoryId=5,lft=11,rgt=12,...

यदि आप MPTT PHP MySQL के लिए खोज कोड के साथ अधिक विस्तृत उदाहरण मिल सकते हैं। इस विषय पर कुछ ट्यूटोरियल हैं।

+0

धन्यवाद .. इसे जांच रहा है .. – VibhaJ

+3

@ विभाः एक और विकल्प एक बंद करने की मेज होगी: http://karwin.blogspot.de/2010/03/rendering-trees-with-closure-tables.html जिसमें अतिरिक्त लाभ है कि आपके पास यह सुनिश्चित करने के लिए विदेशी कुंजी हो सकती है कि मूल श्रेणी वास्तव में मौजूद है। –

+0

बीटीडब्ल्यू, मैं आम तौर पर तालिका में माता-पिता (और मैं गहराई भी जोड़ता हूं) रखते हुए एमपीटीटी का उपयोग करता हूं, फिर उसे तत्काल रिश्तेदारों को ढूंढने का कोई नुकसान नहीं होता है ... – poncha

2

आप एक संग्रहीत फ़ंक्शन का उपयोग कर सकते हैं जो रूट पथ को रिकर्सिव रूप से लाएगा और आपके माता-पिता के साथ मिल जाएगा।

DELIMITER $$ 
DROP FUNCTION IF EXISTS `get_category`$$ 
CREATE FUNCTION `get_category`(cat_id int) RETURNS VARCHAR(255) 
READS SQL DATA 
BEGIN 
DECLARE c_id INT; 
DECLARE p_id INT; 
DECLARE count INT; 
DECLARE cat_name VARCHAR(255); 
DECLARE cat_path VARCHAR(255); 
set c_id = cat_id; 
SELECT parent_category_id, category_name INTO p_id, cat_name FROM categories WHERE category_id = c_id; 
set c_id = p_id; 
set cat_path=cat_name; 
set count=0; 
WHILE (c_id IS NOT NULL) DO 

SELECT parent_category_id, category_name INTO p_id, cat_name FROM categories WHERE category_id = c_id; 
set c_id = p_id; 
set cat_path = concat_ws('>',cat_name,cat_path); 
set count = count + 1; 
IF count=10 THEN 
    SET c_id = NULL; 
END IF; 
END WHILE; 
RETURN cat_path; 
END 
$$ 
DELIMITER ; 

और फिर इस समारोह मैं एक मानसिक स्वास्थ्य की जांच बना दिया है ताकि अनंत पाशन से बचने के लिए

select getcategory(category_id); 

Herre का उपयोग कर कॉल .. यह सर्वर भाषाओं pgoramming के लिए

+1

हालांकि यह एक श्रेणी के लिए पथ खोजता है, इसलिए यदि आप एक पेड़ ला रहे हैं, तो इसे हर परिणाम के लिए कॉल करने की आवश्यकता होगी ... लेकिन वैसे भी अच्छा;) – poncha

+0

यह सिर्फ एक प्रोटोटाइप है, आप इसे एक प्रक्रिया में, एक कर्सर के साथ और प्रत्येक श्रेणी में लूप को संशोधित कर सकते हैं पेड़ .. और आगे बढ़ो .. मुझे विश्वास है कि यह किया जा सकता है – satdev86

संबंधित मुद्दे