2012-07-08 13 views
5

मेरे पास एक सारणी है जहां उत्पादों को पेड़ संरचना जैसे पदानुक्रमित संबंधों के आधार पर वर्गीकृत किया गया है। मुझे किसी भी स्तर पर एक श्रेणी और सभी उपश्रेणियों का चयन करना है।पदानुक्रमित संबंधों के लिए एसक्यूएल

enter image description here

उदहारण के लिए: नीचे चित्र देखें मैं एक एसक्यूएल बयान चाहते हैं कि जब मैं आईडी = 11 गुजर क्वेरी, यह मुझे देता है (19,20,21,22,23,24,25,26)

उत्तर

1
SELECT * FROM `Products` 
WHERE parentId IN (
    SELECT id FROM `Products` 
    WHERE parentId = 11) 

नोट: यह करता है, तो काम नहीं करेगा आपका पदानुक्रम 2 स्तरों से गहरा है।

9

MySQL में हेरार्किकल डेटा स्टोर करने के कई अलग-अलग तरीके हैं। बिल करविन के presentation देखें जो चार विकल्प प्रदर्शित करता है।

  • संलग्नता सूची
  • पथ गणन
  • नेस्टेड सेट
  • बंद टेबल

आप heirarchical डेटा भंडारण के लिये समीपता सूची मॉडल का उपयोग कर रहे हैं, लेकिन दुर्भाग्य से इस सबसे मुश्किल है मॉडल आप subtrees पूछताछ के लिए चुन सकते हैं।

nested sets query subtree

आपके विकल्प हैं:

  • एक अलग मॉडल के लिए बदलें।
  • एन स्तरों को गहराई से प्रश्नों को प्रतिबंधित करें।
  • पुनरावर्ती क्वेरी करने के लिए संग्रहीत प्रक्रिया का उपयोग करें। इसके बारे में अधिक जानकारी के लिए, Quassnoi की लेखों की श्रृंखला देखें - Hierarchical queries in MySQL
1

क्या आप एक गणना लिनेज कॉलम को शामिल करने के लिए अपनी डेटा-संरचना को थोड़ा बदल सकते हैं। great article है जो आपको सामान्य अवधारणा (डेटाबेस प्रकार को अनदेखा करता है) दिखाता है।

मूल रूप से अपने गणना वंशावली स्तंभ उदाहरण

मद 26 \11\

होते हैं आप एक सबआइटम था के लिए उस में माता-पिता की सूची होनी चाहिए आप

\11\subitem\

तो हो सकता था आप बस अपनी लिनेज टेबल पर एक तरह की जांच कर सकते हैं, यह एक पुनरावृत्ति खोज से बहुत तेज़ है, और आप इसे संग्रहीत प्रो या ट्रिगर्स का उपयोग करके बना सकते हैं।

Node ParentNode EmployeeID Depth Lineage 
100  NULL   1001   0 /
101  100   1002   1 /100/ 
102  101   1003   2 /100/101/ 
103  102   1004   3 /100/101/102/ 
104  102   1005   3 /100/101/102/ 
105  102   1006   3 /100/101/102/ 
0

यह गंदा है, और आप n यूनियनों करने के लिए है, जहां n है कितना गहरा अपने पदानुक्रम है होगा, लेकिन यह काम करना चाहिए:

SELECT * FROM `Products` WHERE parentId IN (
    SELECT id FROM `Products` WHERE parentId = 11) 
UNION 
SELECT * FROM `Products` WHERE parentId IN (
    SELECT id FROM `Products` WHERE parentId IN (
     SELECT id FROM `Products` WHERE parentId = 11)) 
UNION 
SELECT * FROM `Products` WHERE parentId IN (
    SELECT id FROM `Products` WHERE parentId IN (
     SELECT id FROM `Products` WHERE parentId IN (
      SELECT id FROM `Products` WHERE parentId = 11))) 
संबंधित मुद्दे