2012-11-19 24 views
72

में अगर मैं एक मेज है MySQL में निम्न डेटा के साथ उपयोग करने के लिए:कैसे group_concat एक concat में MySQL

id  Name  Value 
1   A   4 
1   A   5 
1   B   8 
2   C   9 

मैं इसे कैसे मिलता है निम्नलिखित प्रारूप में?

id   Column 
1   A:4,5,B:8 
2   C:9 


मुझे लगता है मैं GROUP_CONCAT उपयोग करने के लिए है, लेकिन मुझे यकीन है कि यह कैसे काम करता नहीं हूँ।

उत्तर

100
select id, group_concat(`Name` separator ',') as `ColumnName` 
from 
(
    select id, concat(`Name`, ':', 
    group_concat(`Value` separator ',')) as `Name` 
    from mytbl 
    group by id, `Name` 
) tbl 
group by id; 

आप देख सकते हैं इसे यहाँ लागू किया: Sql Fiddle Demo। वास्तव में आपको क्या चाहिए।

अद्यतन दो चरणों में विभाजित। सबसे पहले हमें एक अद्वितीय [नाम, आईडी] के खिलाफ सभी मान (अल्पविराम से अलग) होने वाली तालिका मिलती है। तब प्राप्त मेज से हम सभी के नाम और मान प्रत्येक विशिष्ट आईडी के खिलाफ एक भी मान के रूप में देखें इस यहाँ समझाया SQL Fiddle Demo (नीचे स्क्रॉल के रूप में यह दो परिणाम सेट है)

संपादित प्रश्न पढ़ने में गलती हुई हो, मैं केवल आईडी द्वारा समूहित किया गया था। लेकिन दो समूह_ संपर्कों की आवश्यकता है यदि (मूल्यों को नाम और आईडी द्वारा समूहीकृत किया जाना चाहिए और फिर आईडी द्वारा सभी को समेकित किया जाना चाहिए)। पिछला जवाब

select 
id,group_concat(concat(`name`,':',`value`) separator ',') 
as Result from mytbl group by id 

था आप देख सकते हैं इसे यहाँ लागू किया: SQL Fiddle Demo

+0

यह बिस्वा ने जो नहीं पूछा वह नहीं देता है। – eisberg

+3

धन्यवाद, मैं यही हूं कि मैं @biswa – Biswa

+2

के लिए पूछ रहा हूं, मुझे लगता है कि लोगों को चेतावनी देना महत्वपूर्ण है कि केवल एक प्रकार का विभाजक उपयोग करना हानिकारक हो सकता है। मैं "नाम" विभाजक को अर्धविराम (;) के रूप में बनाने का सुझाव देता हूं, और मूल्य विभाजक अल्पविराम (,) –

15

प्रयास करें:

CREATE TABLE test (
    ID INTEGER, 
    NAME VARCHAR (50), 
    VALUE INTEGER 
); 

INSERT INTO test VALUES (1, 'A', 4); 
INSERT INTO test VALUES (1, 'A', 5); 
INSERT INTO test VALUES (1, 'B', 8); 
INSERT INTO test VALUES (2, 'C', 9); 

SELECT ID, GROUP_CONCAT(NAME ORDER BY NAME ASC SEPARATOR ',') 
FROM (
    SELECT ID, CONCAT(NAME, ':', GROUP_CONCAT(VALUE ORDER BY VALUE ASC SEPARATOR ',')) AS NAME 
    FROM test 
    GROUP BY ID, NAME 
) AS A 
GROUP BY ID; 

एसक्यूएल फिडल: http://sqlfiddle.com/#!2/b5abe/9/0

+2

हाँ eisberg +1। आपका जवाब काफी सटीक और पहले है। मैंने अपने पहली बार जवाब में एक गलती की – Sami

+0

@ सैमी धन्यवाद! – eisberg

0

IF OBJECT_ID('master..test') is not null Drop table test

CREATE TABLE test (ID INTEGER, NAME VARCHAR (50), VALUE INTEGER); 
INSERT INTO test VALUES (1, 'A', 4); 
INSERT INTO test VALUES (1, 'A', 5); 
INSERT INTO test VALUES (1, 'B', 8); 
INSERT INTO test VALUES (2, 'C', 9); 

select distinct NAME , LIST = Replace(Replace(Stuff((select ',', +Value from test where name = _a.name for xml path('')), 1,1,''),'<Value>', ''),'</Value>','') from test _a order by 1 desc 

मेरे तालिका नाम परीक्षण है, और concatination के लिए मैं एक्सएमएल पथ के लिए उपयोग करते हैं ('') वाक्य - विन्यास। सामग्री फ़ंक्शन एक स्ट्रिंग को किसी अन्य स्ट्रिंग में सम्मिलित करता है। यह प्रारंभ स्थिति में पहली स्ट्रिंग में वर्णों की एक निर्दिष्ट लंबाई हटा देता है और फिर दूसरी स्ट्रिंग को पहली स्ट्रिंग प्रारंभ स्थिति में डालें।

STUFF कार्यों इस तरह दिखता है: STUFF (character_expression, शुरू, लंबाई, character_expression)

character_expression चरित्र डेटा की एक अभिव्यक्ति है। character_expression वर्ण या बाइनरी डेटा का निरंतर, चर या स्तंभ हो सकता है।

प्रारंभ एक पूर्णांक मान है जो हटाने और सम्मिलन शुरू करने के लिए स्थान निर्दिष्ट करता है। यदि प्रारंभ या लंबाई ऋणात्मक है, एक शून्य स्ट्रिंग वापस कर दी गई है। यदि प्रारंभ पहली वर्ण_एक्सप्रेस से अधिक लंबा है, तो एक शून्य स्ट्रिंग वापस कर दी जाती है। प्रारंभ बिगिन प्रकार का हो सकता है।

लंबाई एक पूर्णांक है जो हटाने के लिए वर्णों की संख्या निर्दिष्ट करता है। यदि लंबाई पहले वर्ण_एक्सप्रेस से अधिक लंबी है, अंतिम वर्ण_एक्सप्रेस में अंतिम वर्ण तक हटाना होता है। लंबाई बिगिन प्रकार का हो सकता है।

5
SELECT ID, GROUP_CONCAT(CONCAT_WS(':', NAME, VALUE) SEPARATOR ',') AS Result 
FROM test GROUP BY ID 
+7

यह अच्छा होगा अगर आप अपने उत्तर में कुछ विवरण जोड़ सकें। यह इस और भविष्य के उत्तरों को बेहतर बनाने के लिए एक सुझाव है। धन्यवाद! –

+0

उप-चयन का उपयोग न करने के लिए उपरोक्त – Heinz

+0

आपके उत्तर के लिए धन्यवाद। यह मुझे बहुत मदद करता है। –

0
SELECT id, GROUP_CONCAT(CONCAT_WS(':', Name, CAST(Value AS CHAR(7))) SEPARATOR ',') AS result 
    FROM test GROUP BY id 

आप कलाकारों का उपयोग करें या परिवर्तित करना होगा, अन्यथा वापसी ब्लॉब हो जाएगा

परिणाम

id   Column 
1   A:4,A:5,B:8 
2   C:9 

है आप परिणाम जैसे कि अजगर या जावा

के रूप में इस कार्यक्रम के द्वारा एक बार फिर से संभाल करने के लिए है
2

सबसे पहले, मुझे एक आईडी रखने का कारण नहीं दिख रहा है जो अद्वितीय नहीं है, लेकिन मुझे लगता है कि यह एक आईडी है एक और टेबल से जोड़ता है। सेकेंड उपकुंजी की कोई आवश्यकता नहीं है, जो सर्वर को धड़कता है। आप एक क्वेरी में ऐसा करते हैं, इस

SELECT id,GROUP_CONCAT(name, ':', value SEPARATOR "|") FROM sample GROUP BY id 

आप तेजी से और सही परिणाम प्राप्त की तरह, और आप उस SEPARATOR द्वारा परिणाम विभाजित कर सकते हैं "|"। मैं हमेशा इस विभाजक का उपयोग करता हूं, क्योंकि इसे एक स्ट्रिंग के अंदर खोजना असंभव है, क्योंकि यह अद्वितीय है। दो ए के साथ कोई समस्या नहीं है, आप केवल मूल्य की पहचान करते हैं। या आपके पास एक और कॉलम हो सकता है, पत्र के साथ, जो भी बेहतर है। इस तरह:

SELECT id,GROUP_CONCAT(DISTINCT(name)), GROUP_CONCAT(value SEPARATOR "|") FROM sample GROUP BY name 

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

  • कोई संबंधित समस्या नहीं^_^