MySQL में CONCAT में GROUP_CONCAT का उपयोग कैसे करें


117

यदि मेरे पास 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। लेकिन मुझे यकीन नहीं है कि यह कैसे काम करता है।

जवाबों:


160
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 । बिल्कुल वही जो आपको चाहिए।

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

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

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

आप इसे यहां लागू देख सकते हैं: SQL फिडेल डेमो


इससे बिसवा ने जो मांगा वह नहीं दिया।
आईसबर्ग

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

4
कृपया यह भी ध्यान दें कि GROUP_CONCATचुपचाप इसके उत्पादन को कम कर सकते हैं group_concat_max_lenSET group_concat_max_len=...मदद करेगा, लेकिन यह जांचने के लिए एक अच्छा विचार है कि लौटे (बाइट?) की लंबाई की तुलना में कम है group_concat_max_len
tuomassalo

2
यह भी ध्यान दें कि group_concat एक एकल NULL मान का सामना करता है यह पूरी पंक्ति को छोड़ देगा जो इसमें समाहित है। मैं इसके बारे में यहां दूसरे कैविएट में काम करता हूं ।
MatrixManAtYrService

1
यदि किसी को जवाब में दिए गए SQL Fiddle लिंक के साथ समस्या का सामना करना पड़ रहा है। वर्किंग फिडेल
हितेश

21

प्रयत्न:

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
हाँ ईस्बर्ग +1। आपका उत्तर बहुत सटीक और पुराना है। मैंने अपने पहली बार जवाब में एक गलती की
सामी

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

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

5

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

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

2
 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

आपको अजगर या जावा जैसे प्रोग्राम द्वारा एक बार फिर से परिणाम को संभालना होगा


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

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

STUFF फ़ंक्शंस इस तरह दिखाई देते हैं: STUFF (character_expression, start, length, character_expression)

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

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

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


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.