MySQL में GROUP_CONCAT() का उपयोग करके डुप्लिकेट पंक्तियों को मर्ज करना
MySQL में किसी कॉलम के डुप्लिकेट मानों वाली पंक्तियों को समूहित करके, दूसरे कॉलम के मानों को अल्पविराम से अलग करके एकल पंक्ति में मर्ज करने के लिए GROUP_CONCAT() फ़ंक्शन का उपयोग करें।
सिंटैक्स
SELECT group_column, GROUP_CONCAT(DISTINCT other_column SEPARATOR ',')
FROM table_name
GROUP BY group_column;
mysql> SELECT * FROM DemoTable734;
+------+-------+
| Id | Name |
+------+-------+
| 101 | John |
| 102 | John |
| 103 | Chris |
| 104 | Chris |
| 104 | Chris |
+------+-------+
5 rows in set (0.00 sec)
3. नाम के अनुसार मर्ज करें (अद्वितीय IDs)
mysql> SELECT Name, GROUP_CONCAT(DISTINCT Id SEPARATOR ',') FROM DemoTable734 GROUP BY Name;
+-------+-----------------------------------------+
| Name | GROUP_CONCAT(DISTINCT Id SEPARATOR ',') |
+-------+-----------------------------------------+
| Chris | 103,104 |
| John | 101,102 |
+-------+-----------------------------------------+
2 rows in set (0.04 sec)
GROUP_CONCAT विकल्प
विकल्प
विवरण
उदाहरण
DISTINCT
डुप्लिकेट मान हटाता है
GROUP_CONCAT(DISTINCT Id)
SEPARATOR ','
विभाजक सेट करें (डिफ़ॉल्ट ',')
SEPARATOR '; '
ORDER BY
परिणाम में क्रम निर्दिष्ट करें
ORDER BY Id DESC
LIMIT
अधिकतम मान संख्या (MySQL 8.0+)
LIMIT 5
पूर्ण उदाहरण
SELECT Name,
GROUP_CONCAT(DISTINCT Id ORDER BY Id DESC SEPARATOR '; ') AS ids
FROM DemoTable734
GROUP BY Name;
GROUP_CONCAT लंबाई सीमा
डिफ़ॉल्ट अधिकतम लंबाई: 1024 बाइट्स (कॉन्फ़िगरेबल)
-- सत्र के लिए बढ़ाएं
SET SESSION group_concat_max_len = 10000;
-- वैश्विक रूप से बढ़ाएं (my.cnf या रनटाइम)
SET GLOBAL group_concat_max_len = 1000000;
उपयोग के मामले
एक-से-बहुत संबंधों को CSV में निर्यात
टैग/श्रेणी सूचियाँ बनाना
रिपोर्टिंग के लिए डेटा डी-नॉर्मलाइज़ करना
ईमेल/आईडी सूचियाँ उत्पन्न करना
विपरीत: पंक्तियों में विभाजित करना (स्प्लिट)
MySQL में सीधा स्प्लिट फ़ंक्शन नहीं है। विकल्प:
एप्लिकेशन लेयर पर प्रोसेस करें
रिकर्सिव CTE (MySQL 8.0+)
संख्या टेबल के साथ JOIN
रिकर्सिव CTE उदाहरण (MySQL 8.0+)
WITH RECURSIVE split AS (
SELECT Name,
SUBSTRING_INDEX(ids, ',', 1) AS id,
SUBSTRING(ids, LENGTH(SUBSTRING_INDEX(ids, ',', 1)) + 2) AS rest
FROM (SELECT Name, GROUP_CONCAT(Id) AS ids FROM DemoTable734 GROUP BY Name) t
UNION ALL
SELECT Name,
SUBSTRING_INDEX(rest, ',', 1),
SUBSTRING(rest, LENGTH(SUBSTRING_INDEX(rest, ',', 1)) + 2)
FROM split WHERE rest != ''
)
SELECT Name, id FROM split;
बैच इंसर्ट करने के लिए, हमें सभी कॉलम नामों को पैरेंथेसिस में, कॉमा से अलग करके उपयोग करना होगा।आइए एक उदाहरण देखें। पहले, हम एक टेबल बनाएंगे। टेबल बनाने के लिए निम्नलिखित CREATE कमांड है:mysql> CREATE TABLE MultipleRecordWithValues> (> id INT,> name VARCHAR(100)> );Query OK, 0 rows a
हम MySQL में एपोस्ट्रोफी () को निम्नलिखित दो तरीकों से एस्केप कर सकते हैं:
बैकस्लैश (\) का उपयोग करके
सिंगल कोट को दो बार लिखकर (डबल कोटेड)
बैकस्लैश का उपयोग करना
आइए पहले एक टेबल बनाते हैं।
);
Query OK, 0 rows affected (1.16 sec)
Johns नाम के लिए सीधा उपयोग वांछित परिणाम नहीं देता।
आइए अब
MySQL से अंतिम 10 रो चुनने के लिए, हम SELECT स्टेटमेंट और LIMIT कॉन्सेप्ट के साथ सबक्वेरी का उपयोग कर सकते हैं। निम्न एक उदाहरण है।
टेबल बनाना।
mysql> create table Last10RecordsDemo
-> (
-> id int,
-> name varchar(100)
-> );
Query OK, 0 rows affected (0.75 sec)
टेबल में रिकॉर