2011-06-03 11 views
5

मैं निम्नलिखित डेटाबेस तालिका 'आलेख' से कुछ डेटा प्राप्त करना चाहता हूं। enter image description hereइस समस्या के लिए SQL क्वेरी क्या होगी?

मैं एक लेख जानकारी प्राप्त करना चाहता हूं जिसका श्रेणी_आईडी 4 है। लेकिन परिणाम में इसके मूल श्रेणियों के सभी रिकॉर्ड होना चाहिए।

उदाहरण के लिए:
'आलेख 1' में अभिभावक 'उप श्रेणी 1' है और इसका अभिभावक 'मुख्य श्रेणी' है। तो परिणाम तालिका से 1,2,4 पंक्तियों होना चाहिए।

क्या इसके लिए एक एसक्यूएल क्वेरी लिखना संभव है? क्वेरी क्या होगी जो उपर्युक्त शर्त के अनुसार डेटा ला सकती है?

कृपया मुझे मार्गदर्शन करें .. !!

धन्यवाद ..

उत्तर

4

इस लेख का संदर्भ लें: 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; 

यह कुछ जटिल है, लेकिन संग्रहीत प्रक्रिया बनाने के बाद, इसका उपयोग करना मुश्किल नहीं होगा।

+0

साझा करने के लिए धन्यवाद .. hierarchyid कोशिश यह लेख hierarachy के 4 स्तर के लिए क्वेरी दे। यहां पदानुक्रम का अधिकतम स्तर अलग-अलग 'category_id' के लिए अज्ञात हो सकता है। – Vin

2

एमएस एसक्यूएल 2005/2008 में:

with cte(category_id, parent_id, title) 
as 
(
    select category_id, parent_id, title 
    from Category 
    where category_id = 4 
    union all 
    select cat.category_id, cat.parent_id, cat.title 
    from Category cat 
     join cte on 
      cat.category_id = cte.parent_id 
) 
select * 
from cte  
1

यह एक पुनरावर्ती पूछताछ के रूप में एसक्यूएल में जाना जाता है। ओरेकल और पोस्टग्रेस्क्ल एलेक्स एज़ा ’ के उत्तर से एक अलग वाक्यविन्यास का उपयोग करते हैं, और MySQL में, मैं ’ नहीं सोचता कि आप इसे एक प्रश्न में कर सकते हैं।

WITH RECURSIVE t(category_id, parent_id, title) AS 
(SELECT category_id, parent_id, title 
    from Category 
    where category_id = 4) 
UNION ALL 
SELECT c.category_id, c.parent_id, c.title 
FROM Category c, t WHERE t.parent_id=c.category_id /* ends when parent_id==-1 */ 
) 
SELECT * FROM t; 

RECURSIVE आवश्यक है।

0

अगर आप sqlserver 2008 का उपयोग कर रहे हैं तो MSDN

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