GROUP_CONCAT([DISTINCT] expr [ORDER BY {col|expr} [ASC|DESC]] [SEPARATOR 'sep'])
| id | name |
|---|---|
| 1 | 10 |
| 1 | 20 |
| 1 | 20 |
| 2 | 20 |
| 3 | 200 |
| 3 | 500 |
SELECT id, GROUP_CONCAT(name) FROM aa GROUP BY id;
-- 1 | 10,20,20
-- 2 | 20
-- 3 | 200,500
SELECT id, GROUP_CONCAT(name SEPARATOR ';') FROM aa GROUP BY id;
-- 1 | 10;20;20
-- 2 | 20
-- 3 | 200;500
SELECT id, GROUP_CONCAT(DISTINCT name) FROM aa GROUP BY id;
-- 1 | 10,20
-- 2 | 20
-- 3 | 200,500
SELECT id, GROUP_CONCAT(name ORDER BY name DESC) FROM aa GROUP BY id;
-- 1 | 20,20,10
-- 2 | 20
-- 3 | 500,200
SELECT id, GROUP_CONCAT(DISTINCT name ORDER BY name DESC SEPARATOR '|') FROM aa GROUP BY id;
-- 1 | 20|10
-- 2 | 20
-- 3 | 500|200
SELECT c.id, c.name,
GROUP_CONCAT(DISTINCT t.tag_name ORDER BY t.tag_name SEPARATOR ',') AS tags
FROM contacts c
LEFT JOIN contact_tags ct ON c.id = ct.contact_id
LEFT JOIN tags t ON ct.tag_id = t.id
GROUP BY c.id, c.name;
| 限制 | 預設值 | 調整方式 |
|---|---|---|
| group_concat_max_len | 1024 字節 | SET SESSION group_concat_max_len = 1000000; |
| max_allowed_packet | 4MB/1MB | 結果長度受限於此,需同步調大 |
**注意**:超過長度會**靜默截斷**,不報錯,務必按業務預估調大。
GROUP BY 欄位、ORDER BY 欄位) 避免 filesortDISTINCT (需臨時表去重)善用 GROUP_CONCAT,一行搞定多行聚合輸出。