MySQL में स्ट्रिंग को संक्षिप्त करने के लिए GROUP BY का उपयोग कैसे करें?


351

मूल रूप से सवाल यह है कि इससे कैसे प्राप्त करें:

foo_id foo_name
1 ए
1 बी
2 सी

इसके लिए:

foo_id foo_name
1 एबी
2 सी

13
डाउनलोड करें यह वास्तव में एक स्तंभ स्ट्रिंग नाम देने के लिए भ्रमित है, यह एक ऐसा नाम है जो डेटा प्रकार की तरह दिखता है। इसलिए कोई भी उत्तर इससे प्रभावित होता है क्योंकि जब वे किसी स्तंभ नाम को निर्दिष्ट कर रहे होते हैं, तो जवाब ऐसे दिखते हैं जैसे वे किसी डेटा प्रकार को निर्दिष्ट कर रहे हैं
बार्लोप

2
@barlop ने तय किया कि सवाल और जवाब को संपादित करके।
ustun

जवाबों:


526
SELECT id, GROUP_CONCAT(name SEPARATOR ' ') FROM table GROUP BY id;

http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

ऊपर दिए गए लिंक से GROUP_CONCAT: यह फ़ंक्शन किसी समूह से संक्षिप्त गैर-पूर्ण मान के साथ एक स्ट्रिंग परिणाम देता है। यदि कोई गैर-पूर्ण मान नहीं है तो यह NULL देता है।


164
SELECT id, GROUP_CONCAT( string SEPARATOR ' ') FROM table GROUP BY id

अधिक जानकारी यहाँ

ऊपर दिए गए लिंक से GROUP_CONCAT: यह फ़ंक्शन किसी समूह से संक्षिप्त गैर-पूर्ण मान के साथ एक स्ट्रिंग परिणाम देता है। यदि कोई गैर-पूर्ण मान नहीं है तो यह NULL देता है।


परिणामी कॉलम में वर्णों की सीमा है। देखने के लिए यहाँ और डॉक्स :)
Marlo

18
SELECT id, GROUP_CONCAT(CAST(name as CHAR)) FROM table GROUP BY id

आपको कॉमा-सीमांकित स्ट्रिंग देगा


17
SELECT id, GROUP_CONCAT(name SEPARATOR ' ') FROM table GROUP BY id;

: - MySQL में, आप अभिव्यक्ति संयोजनों का संक्षिप्त मान प्राप्त कर सकते हैं। डुप्लिकेट मानों को समाप्त करने के लिए, DISTINCT क्लॉज का उपयोग करें । परिणाम में मानों को सॉर्ट करने के लिए, ORDER BY क्लॉज का उपयोग करें। रिवर्स ऑर्डर में सॉर्ट करने के लिए , ORDER BY क्लॉज में आपके द्वारा सॉर्ट किए जा रहे कॉलम के नाम पर DESC (अवरोही) कीवर्ड जोड़ें । डिफ़ॉल्ट आरोही क्रम है; यह ASC कीवर्ड का उपयोग करके स्पष्ट रूप से निर्दिष्ट किया जा सकता है। समूह में मानों के बीच डिफ़ॉल्ट विभाजक अल्पविराम (",") है। स्पष्ट रूप से विभाजक निर्दिष्ट करने के लिए, स्ट्रिंग मानों के बाद SEPARATOR का उपयोग करें जिसे समूह मानों के बीच डाला जाना चाहिए। विभाजक को पूरी तरह से समाप्त करने के लिए, SEPARATOR को निर्दिष्ट करें ''

GROUP_CONCAT([DISTINCT] expr [,expr ...]
             [ORDER BY {unsigned_integer | col_name | expr}
                 [ASC | DESC] [,col_name ...]]
             [SEPARATOR str_val])

या

mysql> SELECT student_name,
    ->     GROUP_CONCAT(DISTINCT test_score
    ->               ORDER BY test_score DESC SEPARATOR ' ')
    ->     FROM student
    ->     GROUP BY student_name;

15

परिणाम को उस अधिकतम लंबाई तक काट दिया जाता है जो group_concat_max_len सिस्टम चर द्वारा दिया जाता है, जिसका डिफ़ॉल्ट मान 1024 वर्ण है, इसलिए हम पहले करते हैं:

SET group_concat_max_len=100000000;

और फिर, उदाहरण के लिए:

SELECT pub_id,GROUP_CONCAT(cate_id SEPARATOR ' ') FROM book_mast GROUP BY pub_id

परिणाम अधिकतम लंबाई कि group_concat_max_len प्रणाली चर है, जो एक है द्वारा दिया जाता है करने के लिए दिया जाता है डिफ़ॉल्ट मान का 1024 अक्षर। डॉक्स
Marlo

इस group_concat_max_lenकॉन्फिगरेशन का स्कोप क्या है ? वर्तमान कनेक्शन / सत्र, या यह अन्य ग्राहकों को प्रभावित करेगा?
फ्रोजन फ्लेम

@FrozenFlame:> यदि कोई संशोधक मौजूद नहीं है, तो SET सत्र चर को बदलता है। यदि चर का कोई सत्र मान नहीं है, तो एक त्रुटि उत्पन्न होती है। से dev.mysql.com/doc/refman/5.7/en/using-system-variables.html
arminrosu

3
यह ओपी के सवाल का जवाब नहीं देता है लेकिन केवल सहायक जानकारी जोड़ता है। यह एक टिप्पणी होनी चाहिए, एक जवाब नहीं।
बीन

1
इस कोड स्निपेट के लिए धन्यवाद, जो कुछ सीमित, तत्काल सहायता प्रदान कर सकता है। एक उचित व्याख्या यह दर्शाती है कि यह समस्या का एक अच्छा समाधान क्यों है, यह बताकर इसके दीर्घकालिक मूल्य में बहुत सुधार करेगा और यह भविष्य के पाठकों के लिए अन्य, समान प्रश्नों के साथ अधिक उपयोगी होगा। कृपया कुछ स्पष्टीकरण जोड़ने के लिए अपने उत्तर को संपादित करें, जिसमें आपके द्वारा की गई धारणाएँ शामिल हैं।
डोनाल्ड डक

11

शानदार जवाब। मुझे NULLS से भी समस्या थी और GROUP_CONCAT के अंदर एक COALESCE को शामिल करके इसे हल करने में कामयाब रहा। उदाहरण इस प्रकार है:

SELECT id, GROUP_CONCAT(COALESCE(name,'') SEPARATOR ' ') 
FROM table 
GROUP BY id;

मनाइए कि यह किसी और के लिए सहायक हो

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