क्या मैं एक क्षेत्र में कई MySQL पंक्तियों को बदल सकता हूं?


1214

का उपयोग करते हुए MySQL, मैं कुछ ऐसा कर सकता हूं:

SELECT hobbies FROM peoples_hobbies WHERE person_id = 5;

मेरा आउटपुट:

shopping
fishing
coding

लेकिन इसके बजाय मैं सिर्फ 1 पंक्ति, 1 कॉल चाहता हूं:

अपेक्षित उत्पादन:

shopping, fishing, coding

कारण यह है कि मैं कई तालिकाओं से कई मानों का चयन कर रहा हूं, और सभी जोड़ियों के बाद मुझे बहुत अधिक पंक्तियां मिली हैं, जो मैं चाहता हूं।

मैंने MySQL Doc पर एक फंक्शन की तलाश की है और यह परिणाम सेटों को स्वीकार करने CONCATया CONCAT_WSकार्य करने की तरह नहीं दिखता है ।

तो क्या यहां कोई जानता है कि यह कैसे करना है?


9
मैंने सिर्फ group_concat का उपयोग करने के बारे में थोड़ा डेमो लिखा है जो आपके लिए उपयोगी हो सकता है: giombetti.com/2013/06/06/mysql-group_concat
मार्क Giombetti

जवाबों:


1737

आप उपयोग कर सकते हैं GROUP_CONCAT:

SELECT person_id, GROUP_CONCAT(hobbies SEPARATOR ', ')
FROM peoples_hobbies
GROUP BY person_id;

लुडविग ने अपनी टिप्पणी में कहा , आप DISTINCTडुप्लिकेट से बचने के लिए ऑपरेटर को जोड़ सकते हैं :

SELECT person_id, GROUP_CONCAT(DISTINCT hobbies SEPARATOR ', ')
FROM peoples_hobbies 
GROUP BY person_id;

जैसा कि जान ने अपनी टिप्पणी में कहा है , आप इसका उपयोग करने से पहले मानों को क्रमबद्ध भी कर सकते हैं ORDER BY:

SELECT person_id, GROUP_CONCAT(hobbies ORDER BY hobbies ASC SEPARATOR ', ')
FROM peoples_hobbies
GROUP BY person_id;

जैसा कि डाॅग ने अपनी टिप्पणी में कहा , परिणाम पर 1024 बाइट की सीमा है। इसे हल करने के लिए, इस क्वेरी को अपनी क्वेरी से पहले चलाएं:

SET group_concat_max_len = 2048;

बेशक, आप 2048अपनी आवश्यकताओं के अनुसार बदल सकते हैं। मान की गणना और असाइन करने के लिए:

SET group_concat_max_len = CAST(
    (SELECT SUM(LENGTH(hobbies)) + COUNT(*) * LENGTH(', ')
    FROM peoples_hobbies 
    GROUP BY person_id)
    AS UNSIGNED
);

154
परिणामी कॉलम में 1024 बाइट्स की सीमा से अवगत रहें (पैरामीटर group_concat_max_len देखें )
Dag

81
और DISTINCTपैरामीटर को जोड़ने पर , आपको कोई डबल्स नहीं मिलेगा। ... GROUP_CONCAT(DISTINCT hobbies)
लुडविग

3
मेरी आवश्यकता एक कॉलम से सभी डेटा प्राप्त करने की थी। ऐसा करने के लिए ग्रुप BY क्लॉज का उपयोग न करें। उदाहरण: SELECT GROUP_CONCAT (ईमेल SEPARATOR ',') उपयोगकर्ताओं से;
जोनाथन बर्जरॉन

1
धन्यवाद, मुझे नहीं पता था कि समूह समापक लंबाई सीमा थी। मुझे जरूरत थी कि मैं एक राक्षस सूची तैयार करूं।
पैट्रिक

9
यदि आप परिणामी फंसे स्ट्रिंग उपयोग में शौक को क्रमबद्ध करना चाहते हैं:SELECT person_id, GROUP_CONCAT(hobbies ORDER BY hobbies ASC SEPARATOR ', ') FROM peoples_hobbies GROUP BY person_id
Jan

106

GROUP_CONCATयदि आपका MySQL संस्करण (4.1) इसका समर्थन करता है तो इस पर एक नज़र डालें । देखें प्रलेखन अधिक जानकारी के लिए।

यह कुछ इस तरह दिखेगा:

  SELECT GROUP_CONCAT(hobbies SEPARATOR ', ') 
  FROM peoples_hobbies 
  WHERE person_id = 5 
  GROUP BY 'all';

11
मुझे लगता है कि group by 'all'यह आवश्यक नहीं है (अधिक अवांछित), क्योंकि यह सभी पंक्तियों को निर्दिष्ट करता है allऔर फिर इन पंक्तियों के बीच तार की तुलना करता है। क्या मैं सही हू?
क्रिज़िसेक

74

कई, अलग-अलग पंक्तियों को संक्षिप्त करने के लिए वैकल्पिक सिंटैक्स

चेतावनी: यह पोस्ट आपको भूखा रखेगी।

दिया हुआ:

मैंने पाया कि मैं एक समूह का चयन करना चाहता हूँ , व्यक्तिगत पंक्तियों का समूह-एक समूह और एक निश्चित क्षेत्र पर।

मान लें कि आपके पास उत्पाद आईडी और उनके नाम और मूल्य की एक तालिका है:

+------------+--------------------+-------+
| product_id | name               | price |
+------------+--------------------+-------+
|         13 | Double Double      |     5 |
|         14 | Neapolitan Shake   |     2 |
|         15 | Animal Style Fries |     3 |
|         16 | Root Beer          |     2 |
|         17 | Lame T-Shirt       |    15 |
+------------+--------------------+-------+

फिर आपके पास कुछ फैंसी-स्कैमेंसी अजाक्स हैं जो इन पिल्लों को चेकबॉक्स के रूप में सूचीबद्ध करते हैं।

आपका भूखा-हिप्पो उपयोगकर्ता चयन करता है 13, 15, 16। आज उसके लिए कोई मिठाई नहीं ...

खोजें:

शुद्ध mysql के साथ एक पंक्ति में अपने उपयोगकर्ता के आदेश को संक्षेप में प्रस्तुत करने का तरीका।

समाधान:

का प्रयोग करें GROUP_CONCATसाथ खंड :IN

mysql> SELECT GROUP_CONCAT(name SEPARATOR ' + ') AS order_summary FROM product WHERE product_id IN (13, 15, 16);

कौन से आउटपुट:

+------------------------------------------------+
| order_summary                                  |
+------------------------------------------------+
| Double Double + Animal Style Fries + Root Beer |
+------------------------------------------------+

बोनस समाधान:

यदि आप कुल मूल्य भी चाहते हैं, तो इसमें टॉस करें SUM():

mysql> SELECT GROUP_CONCAT(name SEPARATOR ' + ') AS order_summary, SUM(price) AS total FROM product WHERE product_id IN (13, 15, 16);
+------------------------------------------------+-------+
| order_summary                                  | total |
+------------------------------------------------+-------+
| Double Double + Animal Style Fries + Root Beer |    10 |
+------------------------------------------------+-------+

पुनश्च: माफी माँगता हूँ अगर आप पास में एक एन-एन नहीं है ...


11
भले ही यह एक अच्छा जवाब है, यह विशुद्ध रूप से जवाब देने की तुलना में विज्ञापन की तरह लगता है। अभी भी एक अच्छी तरह से तैयार जवाब।
फ्लिफी

1
क्या मुझे सहायता प्राप्त हो सकती है stackoverflow.com/q/60278898/11697039 @elbowlobstercowstand
zus



25

मेरे मामले में, मेरे पास Ids की एक पंक्ति थी, और इसे चार्ज करने के लिए डालना आवश्यक था, अन्यथा, परिणाम द्विआधारी प्रारूप में एन्कोड किया गया था:

SELECT CAST(GROUP_CONCAT(field SEPARATOR ',') AS CHAR) FROM table

1
धन्यवाद! बिना CASTमुझे [BLOB - 14 Bytes]परिणाम में LIKE मान था !
Mel_T

1
क्या मुझे सहायता प्राप्त हो सकती है stackoverflow.com/q/60278898/11697039 @Fedir RYKHTIK
zus

16

निम्नलिखित की तरह MySQL (5.6.13) सत्र चर और असाइनमेंट ऑपरेटर का उपयोग करें

SELECT @logmsg := CONCAT_ws(',',@logmsg,items) FROM temp_SplitFields a;

तो आप प्राप्त कर सकते हैं

test1,test11

2
क्या यह GROUP_CONCAT से अधिक तेज़ है?
jave.web

1
मैंने परीक्षण तालिका में विवरण स्तंभ (varchar (50)) पर MySQL सर्वर v5.6.17 के साथ PHPMyAdmin के तहत इसका परीक्षण किया लेकिन यह प्रत्येक रिकॉर्ड के लिए एक BLOB क्षेत्र देता है:SELECT @logmsg := CONCAT_ws(',',@logmsg,description) from test
Jan

14

मेरे पास एक अधिक जटिल क्वेरी थी, और पाया कि मुझे GROUP_CONCATइसे काम करने के लिए बाहरी क्वेरी में उपयोग करना था:

मूल प्रश्न:

SELECT DISTINCT userID 
FROM event GROUP BY userID 
HAVING count(distinct(cohort))=2);

बिखर गया:

SELECT GROUP_CONCAT(sub.userID SEPARATOR ', ') 
FROM (SELECT DISTINCT userID FROM event 
GROUP BY userID HAVING count(distinct(cohort))=2) as sub;

आशा है कि यह किसी की मदद कर सकता है।


9

किसी के लिए यहाँ देख कैसे GROUP_CONCATउपश्रेणी के साथ उपयोग करने के लिए - इस उदाहरण पोस्टिंग

SELECT i.*,
(SELECT GROUP_CONCAT(userid) FROM favourites f WHERE f.itemid = i.id) AS idlist
FROM items i
WHERE i.id = $someid

इसलिए GROUP_CONCATइसे लपेटकर नहीं, उपकुंजी के अंदर इस्तेमाल किया जाना चाहिए।


1
यह वास्तव में क्या मैं खोज रहा था था
bumerang

7

इसे इस्तेमाल करे:

DECLARE @Hobbies NVARCHAR(200) = ' '

SELECT @Hobbies = @Hobbies + hobbies + ',' FROM peoples_hobbies WHERE person_id = 5;

2
मुझे यही मिला है: 'अपरिचित कथन प्रकार। (स्थिति 0 पर "DECLARE" के पास) '
इस्तियाक अहमद

1

हमारे पास MySql में कॉलम समाप्‍त करने के दो तरीके हैं

select concat(hobbies) as `Hobbies` from people_hobbies where 1

या

select group_concat(hobbies) as `Hobbies` from people_hobbies where 1
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.