เมื่อต้องการรวมค่าจากหลายแถวให้กลายเป็นสตริงเดียว คั่นด้วยคอมมา (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 สำหรับรวมค่าหลายแถวเป็นรายการคั่นคอมมา พร้อมกำจัดซ้ำและเรียงลำดับ