Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> MySQL

MySQL में GROUP_CONCAT और CONCAT_WS का उपयोग करके समान ID वाले रिकॉर्ड्स को विशेष वर्ण से अलग करके संयोजित करें

MySQL में GROUP_CONCAT और CONCAT_WS के साथ पंक्तियों को समूहित करके संयोजित करना

CONCAT_WS() (विभाजक के साथ संयोजित) और GROUP_CONCAT() को मिलाकर, आप एक कॉलम द्वारा पंक्तियों को समूहित कर सकते हैं और दूसरे कॉलम के मानों को कस्टम विभाजक के साथ एक ही स्ट्रिंग में जोड़ सकते हैं।

टेबल बनाना

mysql> CREATE TABLE DemoTable2016 (
    -> UserId INT,
    -> UserName VARCHAR(20)
    -> );
Query OK, 0 rows affected (0.51 sec)

डुप्लिकेट UserId के साथ डेटा डालना

mysql> INSERT INTO DemoTable2016 VALUES (1, 'Chris');
Query OK, 1 row affected (0.17 sec)
mysql> INSERT INTO DemoTable2016 VALUES (2, 'Bob');
Query OK, 1 row affected (0.10 sec)
mysql> INSERT INTO DemoTable2016 VALUES (1, 'David');
Query OK, 1 row affected (0.14 sec)
mysql> INSERT INTO DemoTable2016 VALUES (2, 'Carol');
Query OK, 1 row affected (0.12 sec)
mysql> INSERT INTO DemoTable2016 VALUES (1, 'Sam');
Query OK, 1 row affected (0.14 sec)

सभी रिकॉर्ड्स देखना

mysql> SELECT * FROM DemoTable2016;
+--------+----------+
| UserId | UserName |
+--------+----------+
|      1 | Chris    |
|      2 | Bob      |
|      1 | David    |
|      2 | Carol    |
|      1 | Sam      |
+--------+----------+
5 rows in set (0.00 sec)

UserId द्वारा समूहित करके नाम-ID जोड़े संयोजित करने का क्वेरी

mysql> SELECT GROUP_CONCAT(CONCAT_WS('-', UserName, UserId)) 
    -> FROM DemoTable2016 
    -> GROUP BY UserId;

परिणाम

+----------------------------------------------+
| group_concat(concat_ws('-',UserName,UserId)) |
+----------------------------------------------+
| Chris-1,David-1,Sam-1                        |
| Bob-2,Carol-2                                |
+----------------------------------------------+
2 rows in set (0.00 sec)

फ़ंक्शन विश्लेषण

CONCAT_WS(separator, str1, str2, ...)

  • WS = "With Separator"
  • पहला तर्क विभाजक है
  • बाद के तर्क संयोजित करने के लिए स्ट्रिंग्स हैं
  • स्वचालित रूप से NULL मानों को छोड़ देता है (नियमित CONCAT के विपरीत)
CONCAT_WS('-', 'John', '25')      -- 'John-25'
CONCAT_WS('-', 'John', NULL, '25') -- 'John-25' (NULL छोड़ दिया गया)
CONCAT('-', 'John', NULL, '25')    -- NULL (कोई भी NULL होने पर NULL लौटाता है)

GROUP_CONCAT(expr [ORDER BY ...] [SEPARATOR ...])

  • समूह के भीतर गैर-NULL मानों को संयोजित करता है
  • SEPARATOR डिफ़ॉल्ट ',' है

संयुक्त तर्क

  1. आंतरिक CONCAT_WS('-', UserName, UserId): प्रत्येक पंक्ति के लिए "Name-ID" स्ट्रिंग बनाता है
  2. बाहरी GROUP_CONCAT(...): प्रत्येक UserId समूह के भीतर इन स्ट्रिंग्स को जोड़ता है
  3. GROUP BY UserId: UserId द्वारा पंक्तियों को समूहित करता है

उन्नत विविधताएं

कस्टम GROUP_CONCAT विभाजक

SELECT GROUP_CONCAT(CONCAT_WS('-', UserName, UserId) SEPARATOR '; ') 
FROM DemoTable2016 GROUP BY UserId;

परिणाम: 'Chris-1; David-1; Sam-1'

समूह के भीतर क्रमबद्ध संयोजन

SELECT GROUP_CONCAT(CONCAT_WS('-', UserName, UserId) ORDER BY UserName SEPARATOR ', ') 
FROM DemoTable2016 GROUP BY UserId;

अन्य एग्रीगेट्स के साथ संयोजन

SELECT 
    UserId,
    COUNT(*) AS NameCount,
    GROUP_CONCAT(CONCAT_WS('-', UserName, UserId) ORDER BY UserName SEPARATOR ', ') AS Names,
    MIN(UserName) AS FirstName,
    MAX(UserName) AS LastName
FROM DemoTable2016
GROUP BY UserId;

व्यावहारिक उपयोग मामले

  1. ईमेल सूचियाँ: उपयोगकर्ता प्रति ईमेल संयोजित करना
  2. टैग एग्रीगेशन: लेख प्रति टैग्स संयोजित करना
  3. श्रेणी पथ: पदानुक्रमित श्रेणी पथ बनाना
  4. ऑडिट लॉग: उपयोगकर्ता प्रति क्रियाओं का सारांश
  5. रिपोर्टिंग: विस्तृत पंक्तियों को सारांश पंक्तियों में संक्षिप्त करना

प्रदर्शन और सीमाएं

  • group_concat_max_len (डिफ़ॉल्ट 1024 बाइट्स) परिणाम को काट सकता है
  • बड़े समूहों के लिए: SET SESSION group_concat_max_len = 100000;
  • इंडेक्स GROUP BY को गति देता है: CREATE INDEX idx_userid ON DemoTable2016(UserId);

MySQL 8.0+ विकल्प: JSON_ARRAYAGG

SELECT 
    UserId,
    JSON_ARRAYAGG(JSON_OBJECT('name', UserName, 'id', UserId)) AS UsersJson
FROM DemoTable2016
GROUP BY UserId;

परिणाम: [{"name": "Chris", "id": 1}, {"name": "David", "id": 1}, ...] - संरचित, पार्स करने योग्य, कोई लंबाई सीमा नहीं।

  1. - MySQL में शर्तों के आधार पर एक ही क्वेरी से अलग-अलग ID सेट करें

    परिचय MySQL में CASE स्टेटमेंट का उपयोग करके शर्तों के आधार पर अलग-अलग मान असाइन किए जा सकते हैं। यह लेख दिखाता है कि कैसे एक ही UPDATE क्वेरी में विभिन्न शर्तों के लिए अलग-अलग ID मान सेट करें। उदाहरण: टेबल बनाना और डेटा डालना ); Query OK, 0 rows affected (1.65 sec) INSERT INTO DemoTable1545 VAL

  1. - MySQL में एक ही क्वेरी में एकाधिक रिकॉर्ड कैसे अपडेट करें?

    MySQL में UPDATE स्टेटमेंट में WHERE क्लॉज का उपयोग करके एक ही क्वेरी में एकाधिक कॉलम अपडेट किए जा सकते हैं, लेकिन एकाधिक पंक्तियों को अलग-अलग मानों से अपडेट करने के लिए CASE या एकाधिक क्वेरी की आवश्यकता होती है। उदाहरण: एक पंक्ति, एकाधिक कॉलम तालिका बनाएं: mysql> CREATE TABLE DemoTable ( -&

  1. - MySQL में IN() क्लॉज़ के साथ एक क्वेरी में रिकॉर्ड कैसे डिलीट करें?

    MySQL में एक ही क्वेरी में एकाधिक विशिष्ट रिकॉर्ड डिलीट करने के लिए, DELETE स्टेटमेंट के साथ IN() ऑपरेटर का उपयोग करें। यह एकाधिक DELETE स्टेटमेंट चलाने से अधिक कुशल और पठनीय है। उदाहरण: विशिष्ट StudentId वाले रिकॉर्ड डिलीट करना डेमो टेबल बनाएं: mysql> CREATE TABLE DemoTable1922 ( StudentI