2017-06-21 11 views
5

के लिए बाल अभिलेखों के सभी कॉलम वापस करने का प्रयास कर रहा था, मैं एक ऐसे समाधान की तलाश कर रहा था जिसके द्वारा मैं अभिभावक रिकॉर्ड के लिए सभी बच्चे के रिकॉर्ड प्राप्त कर सकूं। I found a solution that meet my needs as shown hereअभिभावक रिकॉर्ड

केवल समस्या यह है कि उपर्युक्त समाधान आईडी को जोड़ रहा है।

वर्तमान ResultSet

यह अल्पविराम मूल्यों के साथ आईडी कॉलम के अलग किया जाता है = 2,3,4

अपेक्षित आउटपुट

ID Name ParentID 
1  1st  null 
2  2nd  1 
3  3rd  1 
4  4th  2 

मैं नीचे दिए गए कोड की कोशिश की।

SELECT @pv:= 
(SELECT * FROM tblreport WHERE ParentID IN (@pv)) AS lv FROM tblreport 
JOIN 
(SELECT @pv:=2)tmp 
WHERE ParentID IN (@pv) 

और एक त्रुटि संदेश मिला: ओपेरैंड 1 कॉलम (रों)

My sample SQL Fiddle

+0

क्या mysql संस्करण आप के साथ काम कर रहे हैं? – Psi

+0

पंकज, सबसे पहले मैं कहूंगा कि इसे बदलने के लिए संपादन प्रश्न ** ** बहुत अधिक _ ** ताकि अब यह एक पूरी तरह से अलग सवाल हो, एक अच्छा विचार नहीं है। आप हमेशा एक नया सवाल पूछ सकते हैं। आपके वर्तमान प्रश्न के लिए यह स्पष्ट नहीं है कि सभी बाल अभिलेखों के डेटा को वापस कैसे किया जाना चाहिए? आरडीबीएमएस पंक्ति उन्मुख हैं और आप प्रभावी रूप से कई पंक्तियों को एक में विलय करना चाहते हैं।क्या आप निर्दिष्ट कर सकते हैं कि "सुपर-पंक्ति" कैसा दिखना चाहिए? – SergGr

+0

अभी, वे अल्पविराम से अलग हो रहे हैं। लेकिन, मैं एक विशेष पंक्ति के सभी कॉलम वापस करने की उम्मीद कर रहा हूं। कृपया वर्तमान स्थिति के लिए यह उत्तर देखें: https://stackoverflow.com/questions/28363893/mysql-select-recursive-get-all-child-with-multiple-level/28366310#28366310 और मैं सभी कॉलम वापस लौटने के लिए देख रहा हूँ एक पंक्ति और न सिर्फ ids अल्पविराम अलग। – Pankaj

उत्तर

5

अब, वे अल्पविराम से अलग आ रहे हैं शामिल करना चाहिए। लेकिन, मैं एक विशेष पंक्ति के सभी कॉलम वापस करने की उम्मीद कर रहा हूं।

आप इस्तेमाल कर सकते हैं CSV आईडी परिणाम की तरह:

SELECT * 
FROM tblreport 
WHERE FIND_IN_SET(ID,(SELECT GROUP_CONCAT(lv SEPARATOR ',') FROM (
        SELECT @pv:=(SELECT GROUP_CONCAT(ID SEPARATOR ',') 
        FROM tblreport WHERE ParentID IN (@pv)) AS lv FROM tblreport 
        JOIN (SELECT @pv:=1)tmp 
         WHERE ParentID IN (@pv)) a)); 

DBFiddle Demo

आउटपुट:

ID Name ParentID 
2 2nd  1 
3 3rd  1 
4 4th  2 

संपादित करें:

आप भी मूल पंक्ति की जरूरत है आप UNION ALL इस्तेमाल कर सकते हैं:

SET @var = 1; 

SELECT * 
FROM tblreport 
WHERE FIND_IN_SET(ID,(SELECT GROUP_CONCAT(lv SEPARATOR ',') FROM (
        SELECT @pv:=(SELECT GROUP_CONCAT(ID SEPARATOR ',') 
        FROM tblreport WHERE ParentID IN (@pv)) AS lv FROM tblreport 
        JOIN (SELECT @pv:[email protected])tmp 
         WHERE ParentID IN (@pv)) a)) 

UNION ALL 
SELECT * 
FROM tblReport 
WHERE ID = @var 
ORDER BY ID; 

DBFiddle Demo2

+0

क्या आप उस आईडी को भी शामिल कर सकते हैं जिसका उपयोग बाल रिकॉर्ड खोजने के लिए किया जा रहा है? जैसा कि आप अपेक्षित परिणाम सेट में देख सकते हैं? – Pankaj

+0

@Pankaj कृपया जगह में प्रश्न संपादित न करें, क्योंकि अब आपने मेरा जवाब अवैध कर दिया है। यदि आप अपना प्रश्न विस्तारित करना चाहते हैं, तो ** 'EDIT' ** अनुभाग जोड़ें और नई आवश्यकताएं पोस्ट करें। – lad2025

-1

कि उत्पादन बस इस छोटे से क्वेरी द्वारा प्रदान की जाती है:

SELECT * from tblreport WHERE FIND_IN_SET(id, '2,3,4'); 

अभी तक बेहतर ...

MySQL 8.0 या MariaDB 1 का उपयोग करें 0.2 - प्रत्येक में रिक्त सीटीई प्रश्न हैं जो आसानी से पदानुक्रमित डेटाबेस पेड़ को ड्रिल करते हैं।

(सीएसवी का उपयोग न करें, केवल अलग-अलग पंक्तियों का उपयोग करें।)

+0

मैं अल्पविराम से अलग मूल्य कैसे प्राप्त करूं? – Pankaj

+0

मुझे नहीं पता। _You_ ने "2,3,4" का उल्लेख किया; वह कहां से आया है? –

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