มี 2 วิธีหลักในการแสดงผลเป็น Comma-separated List ใน MySQL
วิธีที่ 1: CONCAT() - รวมคอลัมน์ในแถวเดียว (Row-level)
CREATE TABLE CommaSeperateDemo (
Id INT,
FirstName VARCHAR(100),
LastName VARCHAR(100)
);
INSERT INTO CommaSeperateDemo VALUES
(1, 'John', 'Taylor'),
(2, 'Carol', 'Taylor'),
(3, 'Johnson', 'T.');
SELECT CONCAT(Id, ',', FirstName, ',', LastName) AS CONCATEIDFIRSTANDLASTNAME
FROM CommaSeperateDemo;
ผลลัพธ์
+---------------------------+
| CONCATEIDFIRSTANDLASTNAME |
+---------------------------+
| 1,John,Taylor |
| 2,Carol,Taylor |
| 3,Johnson,T. |
+---------------------------+
วิธีที่ 2: GROUP_CONCAT() - รวมหลายแถวเป็น 1 สตริง (Aggregate)
-- รวมชื่อทั้งหมด
SELECT GROUP_CONCAT(FirstName SEPARATOR ', ') AS all_names
FROM CommaSeperateDemo;
-- ผลลัพธ์: John, Carol, Johnson
-- รวมพร้อม ID
SELECT GROUP_CONCAT(CONCAT(Id, ':', FirstName) SEPARATOR '; ') AS id_name_pairs
FROM CommaSeperateDemo;
-- ผลลัพธ์: 1:John; 2:Carol; 3:Johnson
GROUP_CONCAT Options
GROUP_CONCAT(
[DISTINCT] expr
[ORDER BY {col | expr} [ASC|DESC]]
[SEPARATOR 'str']
)
ตัวอย่างครบ
SELECT
GROUP_CONCAT(DISTINCT FirstName ORDER BY FirstName SEPARATOR ', ') AS unique_names,
GROUP_CONCAT(FirstName ORDER BY Id SEPARATOR ',') AS ordered_names
FROM CommaSeperateDemo;
⚠️ ข้อจำกัด GROUP_CONCAT
- Default Max Length: 1024 ตัวอักษร (ตัวแปร
group_concat_max_len) - เพิ่มได้:
SET SESSION group_concat_max_len = 1000000; - คืนค่า NULL ถ้าไม่มี Row Match
- NULL Values จะถูกข้าม (ใช้
IFNULL(col, '')ถ้าต้องการรวม)
ใช้ร่วมกับ GROUP BY
SELECT
LastName,
GROUP_CONCAT(FirstName ORDER BY FirstName SEPARATOR ', ') AS first_names
FROM CommaSeperateDemo
GROUP BY LastName;
ผลลัพธ์
+----------+---------------+
| LastName | first_names |
+----------+---------------+
| T. | Johnson |
| Taylor | Carol, John |
+----------+---------------+
Application: Export CSV
SELECT
GROUP_CONCAT(
CONCAT('"', Id, '","', FirstName, '","', LastName, '"')
SEPARATOR '\n'
) AS csv_data
FROM CommaSeperateDemo;