2013-08-06 8 views
5

मैं mysql में नया हूं।mysql रिकर्सिव (पेड़) पैरेंट बाल श्रेणी

श्रेणी तालिका: यह मेरी मेज है

id | name  | prent 
---------------------------- 
1 | os   | null 
2 | linux  | 1 
3 | ubuntu  | 2 
4 | xubuntu  | 3 
5 | lubuntu  | 3 
6 | zubuntu  | 3 
7 | zubuntu 2 | 6 
8 | suse  | 2 
9 | fedora  | 2 
10 | windowse | 1 
11 | windowse xp | 10 
12 | windowse 7 | 10 
13 | windowse 8 | 10 
14 | food  | null 
15 | dance  | null 

प्रत्येक श्रेणी के एक माता पिता है और मैं उन्हें तैयार करने के लिए एक ड्रॉप-डाउन मेनू में दिखाना चाहते हैं।

यह वह जगह है कि मैं क्या प्राप्त करना चाहते हैं:

id | name   | depth 
---------------------------- 
1 | os   | 0 
2 | -linux  | 1 
3 | --ubuntu  | 2 
4 | ---xubuntu | 3 
5 | ---lubuntu | 3 
6 | ---zubuntu | 3 
7 | ----zubuntu 2 | 4 
8 | --suse  | 2 
9 | --fedora  | 2 
10 | -windows  | 1 
11 | --windows xp | 2 
12 | --windows 7 | 2 
13 | --windows 8 | 2 
14 | food   | 0 
15 | dance   | 0 

यहाँ, श्रेणियों क्रम में नहीं हैं और मेरे कोड बच्चों श्रेणियों अपने माता-पिता से दूर के लिए आदेश प्रदान करने के लिए है। नाम से पहले इंडेंटेशन प्रत्येक श्रेणी के माता-पिता की गहराई के आधार पर प्रदान किया जाता है। प्रत्येक श्रेणी के बच्चों की संख्या के लिए कोई सीमा नहीं है, हालांकि श्रेणियों की कुल संख्या 100 से अधिक नहीं होगी।

क्या कोई प्रश्न है जो इस तरह के परिणाम देता है? मैं एक क्वेरी पसंद करता हूं जिसे PHP ढांचे में active record के रूप में चलाया जा सकता है।

+1

संख्या। mysql रिकर्सिव क्वेरी का समर्थन नहीं करता है। पेड़ के नीचे अपना रास्ता काम करने के लिए आपको अपने कोड में एक पुनरावृत्ति लूप करना होगा। –

+0

क्या आप यहां देख रहे थे? http://stackoverflow.com/questions/8633497/mysql-how-to-query-parent-child?rq=1 –

+0

@EdManet, गहराई की संख्या एक और दो से अधिक के बारे में कैसे? – monjevin

उत्तर

9

यह Thread ने मुझे नेतृत्व किया। @RolandoMySQLDBA

DELIMITER $$ 
DROP FUNCTION IF EXISTS `GetAncestry` $$ 
CREATE FUNCTION `GetAncestry` (GivenID INT) RETURNS VARCHAR(1024) 
DETERMINISTIC 
BEGIN 
    DECLARE rv VARCHAR(1024); 
    DECLARE cm CHAR(1); 
    DECLARE ch INT; 

    SET rv = ''; 
    SET cm = ''; 
    SET ch = GivenID; 
    WHILE ch > 0 DO 
     SELECT IFNULL(`prent`,-1) INTO ch FROM 
     (SELECT `prent` FROM Table1 WHERE id = ch) A; 
     IF ch > 0 THEN 
      SET rv = CONCAT(rv,cm,ch); 
      SET cm = ','; 
     END IF; 
    END WHILE; 
    RETURN rv; 

END $$ 
DELIMITER ; 

एक काम कर fiddle यहाँ के लिए धन्यवाद।

SELECT id,GetAncestry(id) as parents from Table1 where id = 7; 

ID PARENTS 
7 6,3,2,1 
+0

धन्यवाद, क्या मुझे पता चलेगा कि 'ए' का अर्थ क्या है? '(तालिका 1 से चुनें 'पेंट' जहां आईडी = सी) ए;' – monjevin

+0

'ए' इस परिणाम सेट के लिए सिर्फ एक उपनाम नाम है: (तालिका 1 से 'पेंट' चुनें जहां आईडी = सी) –

+0

मुझे पता है कि यह फ़ंक्शन कितना अच्छा है हालांकि, कृपया आप व्याख्या कर सकते हैं कि आप इसे पदानुक्रमित सूची में जोड़ने के लिए पूर्वजों के डेटा का उपयोग कैसे करेंगे (इसके देर से और मेरा दिमाग फायरिंग नहीं कर रहा है) – Hightower

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