2010-03-14 15 views
18

में सभी माता पिता पंक्तियों हो रही है मैं एक सरल MySQL तालिका thats श्रेणियों की एक सूची शामिल है, के स्तर PARENT_ID से निर्धारित होता है:एक SQL क्वेरी

id name parent_id 
--------------------------- 
1 Home  0 
2 About  1 
3 Contact  1 
4 Legal  2 
5 Privacy  4 
6 Products 1 
7 Support  1 

मैं एक ब्रेडक्रंब ट्रेल करने का प्रयास कर रहा हूँ। तो मेरे पास बच्चे का 'आईडी' है, मैं सभी उपलब्ध माता-पिता प्राप्त करना चाहता हूं (जब तक हम 0 "होम" तक नहीं पहुंच जाते तब तक चेन को फिर से चालू करना)। असीमित गहराई में जा रहे किसी भी संख्या या बच्चे की पंक्तियां हो सकती हैं।

वर्तमान में मैं प्रत्येक माता-पिता के लिए एक SQL कॉल का उपयोग कर रहा हूं, यह गन्दा है। एसक्यूएल में यह सब एक प्रश्न पर ऐसा करने का कोई तरीका है?

उत्तर

43

here से अनुकूलित:

SELECT T2.id, T2.name 
FROM (
    SELECT 
     @r AS _id, 
     (SELECT @r := parent_id FROM table1 WHERE id = _id) AS parent_id, 
     @l := @l + 1 AS lvl 
    FROM 
     (SELECT @r := 5, @l := 0) vars, 
     table1 h 
    WHERE @r <> 0) T1 
JOIN table1 T2 
ON T1._id = T2.id 
ORDER BY T1.lvl DESC 

लाइन @r := 5 वर्तमान पृष्ठ के लिए पृष्ठ संख्या है। नतीजा निम्नानुसार है:

1, 'Home' 
2, 'About' 
4, 'Legal' 
5, 'Privacy' 
+6

आप सर ... एक GENIUS हैं !! –

+0

'+ 1' @ मार्क आप परिवर्तनीय प्रश्नों के साथ चमत्कार करते हैं: डी – bonCodigo

+0

वाह ... और उन्होंने कहा कि यह नहीं किया जा सका! – Mike

-2

AFAIK संख्या।

This Sitepoint article आपकी मदद कर सकता है।

आप एक क्वेरी के साथ सभी तत्वों को पुनः प्राप्त कर सकता है एक सरणी में संग्रहीत और फिर पुनरावृति, के रूप में समझाया here और here

0

मुझे लगता है, वहाँ ऐसा करने के लिए, एक क्वेरी का उपयोग कर कोई आसान तरीका है।

मैं Nested Sets पर एक नज़र डालने की सिफारिश करता हूं, जो आपकी आवश्यकताओं के अनुरूप लगता है।

1

मार्क बेयर्स द्वारा बहुत बढ़िया जवाब!

हो सकता है कि एक सा पार्टी के लिए देर हो चुकी है, लेकिन अगर आप भी जब आईडी = PARENT_ID (यानी जब डेटा किसी भी तरह दूषित हो गया है), तो आप इस तरह जवाब विस्तार कर सकते हैं अनंत लूप को रोकने के लिए चाहते हैं:

SELECT T2.id, T2.name 
FROM (
    SELECT 
     @r AS _id, 
     @p := @r AS previous 
     (SELECT @r := parent_id FROM table1 WHERE id = _id) AS parent_id, 
     @l := @l + 1 AS lvl 
    FROM 
     (SELECT @r := 5, @p := 0, @l := 0) vars, 
     table1 h 
    WHERE @r <> 0 AND @r <> @p) T1 
JOIN table1 T2 
ON T1._id = T2.id 
ORDER BY T1.lvl DESC 
0

ऊपर समाधान के अलावा: माता-पिता सहित

post 
----- 
id 
title 
author 

author 
------ 
id 
parent_id 
name 


[post] 

id | title | author | 
---------------------- 
1 | abc | 3  | 


[author] 

| id | parent_id | name | 
|---------------------------| 
| 1  | 0   | u1 | 
| 2  | 1   | u2 | 
| 3  | 2   | u3 | 
| 4  | 0   | u4 | 

एक लेखक पोस्ट करने के लिए एक पहुँच हो सकता है।

मैं यह जांचना चाहता हूं कि लेखक के पास पोस्ट तक पहुंच है या नहीं।

समाधान:

पोस्ट लेखक के आईडी देने के लिए और अपने सभी लेखकों और लेखक के माता-पिता

SELECT T2.id, T2.username 
FROM (
    SELECT @r AS _id, 
     (SELECT @r := parent_id FROM users WHERE id = _id) AS parent_id, 
     @l := @l + 1 
    FROM 
     (SELECT @r := 2, @l := 0) vars, 
     users h  
    WHERE @r <> 0) T1 JOIN users T2 
ON T1._id = T2.id; 

@r वापसी: = 2 => मान निर्दिष्ट चर @r करने के लिए।

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