รวม GROUP_CONCAT() (Aggregate) กับ CONCAT() (String Concatenation) เพื่อสร้าง Output Format ตามต้องการ
ตัวอย่างข้อมูล
CREATE TABLE GroupConcatenateDemo (
id INT,
FirstName VARCHAR(100),
Score INT
);
INSERT INTO GroupConcatenateDemo VALUES
(1, 'John', 94),
(2, 'Bob', 98),
(3, 'Carol', 100);
Basic: GROUP_CONCAT + CONCAT
SELECT
id,
GROUP_CONCAT(CONCAT(FirstName, ':', Score) SEPARATOR ', ') AS FirstNameAndScore
FROM GroupConcatenateDemo
GROUP BY id;
ผลลัพธ์
+------+-------------------+
| id | FirstNameAndScore |
+------+-------------------+
| 1 | John:94 |
| 2 | Bob:98 |
| 3 | Carol:100 |
+------+-------------------+
Advanced: GROUP_CONCAT Options
GROUP_CONCAT(
[DISTINCT] expr
[ORDER BY {col | expr} [ASC|DESC]]
[SEPARATOR 'str']
)
ตัวอย่างครบ
SELECT
-- Unique names, sorted
GROUP_CONCAT(DISTINCT FirstName ORDER BY FirstName SEPARATOR ', ') AS unique_names,
-- All names with score, ordered by id
GROUP_CONCAT(CONCAT(FirstName, ':', Score) ORDER BY Id SEPARATOR '; ') AS all_scores,
-- Custom format: "Name (Score)"
GROUP_CONCAT(CONCAT(FirstName, ' (', Score, ')') ORDER BY Score DESC SEPARATOR ', ') AS ranked
FROM GroupConcatenateDemo;
ผลลัพธ์
+--------------+-------------------------+--------------------------+
| unique_names | all_scores | ranked |
+--------------+-------------------------+--------------------------+
| Bob, Carol, John | John:94; Bob:98; Carol:100 | Carol (100), Bob (98), John (94) |
+--------------+-------------------------+--------------------------+
ใช้กับ GROUP BY (Per Group)
-- เพิ่ม Category Column
ALTER TABLE GroupConcatenateDemo ADD COLUMN Category VARCHAR(20);
UPDATE GroupConcatenateDemo SET Category = 'A' WHERE Id IN (1,2);
UPDATE GroupConcatenateDemo SET Category = 'B' WHERE Id = 3;
SELECT
Category,
GROUP_CONCAT(CONCAT(FirstName, ':', Score) ORDER BY Score DESC SEPARATOR ', ') AS top_scores
FROM GroupConcatenateDemo
GROUP BY Category;
ผลลัพธ์
+----------+---------------------+
| Category | top_scores |
+----------+---------------------+
| A | Bob:98, John:94 |
| B | Carol:100 |
+----------+---------------------+
⚠️ ข้อจำกัด GROUP_CONCAT
- Max Length: 1024 chars (Default) →
SET SESSION group_concat_max_len = 1000000; - NULL Values: ถูกข้าม (ใช้
IFNULL(col, '')ถ้าต้องการรวม) - Memory: ใช้ Memory ในการ Concatenate (ระวัง Result Set ใหญ่)
- Order: ต้องระบุ
ORDER BYใน GROUP_CONCAT เพื่อให้ Deterministic
Use Cases
- Export CSV/JSON จาก Database
- Denormalization สำหรับ Reporting
- Tag/Category Aggregation
- Audit Trail Concatenation