बस आपको ध्यान देने के लिए, ये समाधान स्ट्रिंग तुलनाओं पर आधारित हैं, अनुकूलित नहीं हैं और अनुक्रमणिका का उपयोग नहीं कर सकते हैं। आपको अपनी टेबल को अलग-अलग सामान्य करने पर विचार करना चाहिए। (देखें MySQL में पदानुक्रमित डेटा प्रबंधित करना )
कुछ सवालों के बारे में:
आईडी 9 के सभी बच्चे चुनें:
चूंकि Path
कॉलम में आगे और पीछे वाले स्लैश शामिल नहीं हैं, आपको उन्हें पथ से जोड़ना होगा:
SELECT *
FROM tester
WHERE CONCAT('/', path, '/') LIKE '%/9/%';
9 बच्चों की कुल संख्या का चयन करें, x स्तर गहरा:
हमें पथ में स्लैश की संख्या के आधार पर समूह बनाना होगा, मूल पथ में स्लैश की संख्या घटाकर:
SELECT (LENGTH(c.Path) - LENGTH(REPLACE(c.Path, '/', '')))
- (LENGTH(p.Path) - LENGTH(REPLACE(p.Path, '/', ''))) AS Level,
COUNT(*)
FROM tester c
JOIN tester p ON c.Parent = p.ID
WHERE CONCAT('/', path, '/') LIKE '%/9/%';
GROUP BY 1
सादगी के लिए मैंने उपरोक्त क्वेरी का उपयोग सभी स्तरों को दिखाने के लिए किया है, यदि आप x स्तरों को गहराई तक सीमित करना चाहते हैं, तो WHERE
का उपयोग करें नीचे दी गई क्वेरी से विधेय करें।
9 के सापेक्ष स्तर के साथ, 9 के बच्चों की आईडी को नीचे से x स्तर तक चुनें:
हम Path
. खोजते हैं माता-पिता के स्तर को ध्यान में रखते हुए, x संख्या के स्तर तक कॉलम:
SELECT c.*
FROM tester c
JOIN tester p ON c.Parent = p.ID
WHERE CONCAT(
'/',
SUBSTRING_INDEX(
Path,
'/',
(LENGTH(p.Path) - LENGTH(REPLACE(p.Path, '/', ''))) + 4
),
'/') LIKE '%/9/%'
हम जो कदम उठा रहे हैं:
- हमें यह पता लगाने की आवश्यकता है कि माता-पिता कितने गहरे हैं, हम पा सकते हैं कि माता-पिता के पथ में स्लैश की गणना करके। (
LENGTH(p.Path) - LENGTH(REPLACE(p.Path, '/', ''))
) - हमें उस संख्या में 1 जोड़ना होगा, क्योंकि 1 स्लैश वाला पथ 2 स्तर गहरा है।
- हम वांछित स्तरों की x संख्या जोड़ते हैं।
- पथ स्तंभ को कुल स्तर तक ले जाएं, (
SUBSTRING_INDEX
समारोह)। - अग्रणी और अनुगामी स्लैश जोड़ें।
- 9 के लिए अंतिम स्ट्रिंग खोजें।