क्या मैं एक से अधिक MySQL पंक्तियों को एक क्षेत्र में जोड़ सकता हूं?




concat group-concat (8)

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

SELECT hobbies FROM peoples_hobbies WHERE person_id = 5;

मेरा आउटपुट:

shopping
fishing
coding

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

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

shopping, fishing, coding

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

मैंने MySQL दस्तावेज़ पर एक फ़ंक्शन की तलाश की है और यह CONCAT या CONCAT_WS फ़ंक्शन परिणाम सेट स्वीकार नहीं करता है, तो क्या कोई यहां जानता है कि यह कैसे करें?


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

यह कुछ ऐसा दिखता है:

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

मेरे मामले में मेरे पास आईडी की एक पंक्ति थी, और इसे चारों ओर डालने में सक्षम था, अन्यथा, परिणाम बाइनरी प्रारूप में एन्कोड किया गया था:

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

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

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

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

test1,test11

एकाधिक, व्यक्तिगत पंक्तियों को संयोजित करने के लिए वैकल्पिक वाक्यविन्यास

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

दिया हुआ:

मैंने खुद को कई अलग-अलग पंक्तियों का चयन करना चाहते हैं- एक समूह के पुनर्स्थापना-और एक निश्चित क्षेत्र पर संयोजित करना।

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

+------------+--------------------+-------+
| 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 के साथ, एक पंक्ति में अपने उपयोगकर्ता के आदेश को सारांशित करने का एक तरीका।

उपाय:

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

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 |
+------------------------------------------------+-------+

पीएस: क्षमा करें अगर आपके पास पास -इन-आउट नहीं है ...


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

DECLARE @Hobbies NVARCHAR(200) = ' '

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

आप 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
)

ग्रुप कुल फ़ंक्शन, GROUP_CONCAT


मेरे पास एक और जटिल क्वेरी थी, और पाया कि मुझे काम करने के लिए बाहरी क्वेरी में 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;

उम्मीद है कि यह किसी की मदद कर सकता है।







group-concat