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

MySQL में GROUP_CONCAT() का उपयोग करके डुप्लिकेट पंक्तियों को मर्ज करना

MySQL में किसी कॉलम के डुप्लिकेट मानों वाली पंक्तियों को समूहित करके, दूसरे कॉलम के मानों को अल्पविराम से अलग करके एकल पंक्ति में मर्ज करने के लिए GROUP_CONCAT() फ़ंक्शन का उपयोग करें।

सिंटैक्स

SELECT group_column, GROUP_CONCAT(DISTINCT other_column SEPARATOR ',') 
FROM table_name 
GROUP BY group_column;

व्यावहारिक उदाहरण

1. टेबल बनाएं और डुप्लिकेट डेटा डालें

mysql> CREATE TABLE DemoTable734 (Id INT, Name VARCHAR(100));
Query OK, 0 rows affected (0.73 sec)

mysql> INSERT INTO DemoTable734 VALUES 
(101, 'John'), (102, 'John'), (103, 'Chris'), (104, 'Chris'), (104, 'Chris');
Query OK, 5 rows affected (0.15 sec)

2. मूल डेटा

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 विकल्प

पूर्ण उदाहरण

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;
  1. - MySQL में बैच इंसर्ट कैसे करें?

    बैच इंसर्ट करने के लिए, हमें सभी कॉलम नामों को पैरेंथेसिस में, कॉमा से अलग करके उपयोग करना होगा।आइए एक उदाहरण देखें। पहले, हम एक टेबल बनाएंगे। टेबल बनाने के लिए निम्नलिखित CREATE कमांड है:mysql> CREATE TABLE MultipleRecordWithValues> (> id INT,> name VARCHAR(100)> );Query OK, 0 rows a

  1. - MySQL में एपोस्ट्रोफी (') को कैसे एस्केप करें

    हम MySQL में एपोस्ट्रोफी () को निम्नलिखित दो तरीकों से एस्केप कर सकते हैं: बैकस्लैश (\) का उपयोग करके सिंगल कोट को दो बार लिखकर (डबल कोटेड) बैकस्लैश का उपयोग करना आइए पहले एक टेबल बनाते हैं। ); Query OK, 0 rows affected (1.16 sec) Johns नाम के लिए सीधा उपयोग वांछित परिणाम नहीं देता। आइए अब

  1. MySQL से अंतिम 10 रो कैसे चुनें? MySQL से अंतिम 10 रो कैसे चुनें?

    MySQL से अंतिम 10 रो चुनने के लिए, हम SELECT स्टेटमेंट और LIMIT कॉन्सेप्ट के साथ सबक्वेरी का उपयोग कर सकते हैं। निम्न एक उदाहरण है। टेबल बनाना। mysql> create table Last10RecordsDemo -> ( -> id int, -> name varchar(100) -> ); Query OK, 0 rows affected (0.75 sec) टेबल में रिकॉर

© कॉपीराइट https://in.wsxdn.com सर्वाधिकार सुरक्षित
विकल्पविवरणउदाहरण
DISTINCTडुप्लिकेट मान हटाता हैGROUP_CONCAT(DISTINCT Id)
SEPARATOR ','विभाजक सेट करें (डिफ़ॉल्ट ',')SEPARATOR '; '
ORDER BYपरिणाम में क्रम निर्दिष्ट करेंORDER BY Id DESC
LIMITअधिकतम मान संख्या (MySQL 8.0+)LIMIT 5