Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

MySQL: รวมค่าที่ไม่ซ้ำ (DISTINCT) เป็นรายการคั่นคอมมาด้วย GROUP_CONCAT

เมื่อต้องการรวมค่าจากหลายแถวให้กลายเป็นสตริงเดียว คั่นด้วยคอมมา (comma-delimited) พร้อมกำจัดค่าซ้ำ ใช้ GROUP_CONCAT() ร่วมกับ DISTINCT และ GROUP BY

รูปแบบคำสั่ง

SELECT 
    column1, column2, column3,
    GROUP_CONCAT(DISTINCT column4 ORDER BY column4 SEPARATOR ',') AS alias_name
FROM table_name
GROUP BY column1, column2, column3;
  • DISTINCT - กำจัดค่าซ้ำในกลุ่ม
  • ORDER BY - เรียงลำดับในกลุ่ม (ภายใน GROUP_CONCAT)
  • SEPARATOR ',' - ตัวคั่น (ค่าเริ่มต้นคือคอมมา)

ตัวอย่างการใช้งาน

1. สร้างตารางและเพิ่มข้อมูล

CREATE TABLE CommaDelimitedList (
    Id INT NOT NULL AUTO_INCREMENT,
    Name VARCHAR(10),
    GroupId INT,
    CompanyName VARCHAR(15),
    RefId INT,
    PRIMARY KEY (Id)
);

INSERT INTO CommaDelimitedList (Name, GroupId, CompanyName, RefId) VALUES
('Larry', 5, 'Google', 162),
('Larry', 5, 'Google', 5),
('Larry', 5, 'Google', 4),
('Sam', 6, 'Amazon', 3);

ข้อมูลในตาราง:

+----+-------+---------+-------------+-------+
| Id | Name  | GroupId | CompanyName | RefId |
+----+-------+---------+-------------+-------+
|  1 | Larry |       5 | Google      |   162 |
|  2 | Larry |       5 | Google      |     5 |
|  3 | Larry |       5 | Google      |     4 |
|  4 | Sam   |       6 | Amazon      |     3 |
+----+-------+---------+-------------+-------+

2. รวม RefId ต่อกลุ่ม Name + GroupId + CompanyName

SELECT 
    Name, GroupId, CompanyName,
    GROUP_CONCAT(DISTINCT RefId ORDER BY RefId) AS RefList
FROM CommaDelimitedList
GROUP BY CompanyName, Name, GroupId;

ผลลัพธ์:

+-------+---------+-------------+---------+
| Name  | GroupId | CompanyName | RefList |
+-------+---------+-------------+---------+
| Sam   |       6 | Amazon      | 3       |
| Larry |       5 | Google      | 4,5,162 |
+-------+---------+-------------+---------+

ตัวเลือกและข้อจำกัด

ตัวเลือกคำอธิบาย
DISTINCTกำจัดค่าซ้ำ
ORDER BY col ASC|DESCเรียงลำดับในกลุ่ม
SEPARATOR ';'เปลี่ยนตัวคั่น (default: ',')
GROUP_CONCAT_MAX_LENความยาวสูงสุด (default 1024) - ตั้งค่า: SET SESSION group_concat_max_len = 10000;

กรณีต้องการ DISTINCT ทั้งแถว (ไม่ใช่แค่คอลัมน์เดียว)

SELECT 
    Name, GroupId, CompanyName,
    GROUP_CONCAT(DISTINCT CONCAT(RefId, ':', OtherCol) ORDER BY RefId) AS Combined
FROM CommaDelimitedList
GROUP BY Name, GroupId, CompanyName;

สรุป

GROUP_CONCAT(DISTINCT ... ORDER BY ... SEPARATOR ',') เป็นวิธีมาตรฐานใน MySQL สำหรับรวมค่าหลายแถวเป็นรายการคั่นคอมมา พร้อมกำจัดซ้ำและเรียงลำดับ