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

ใช้ GROUP_CONCAT ร่วมกับ CONCAT ใน MySQL สร้าง String แบบ Custom

รวม 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