GROUP_CONCAT()必须配合GROUP BY使用,否则整表聚合为一行;默认长度1024字节易截断,需调大group_concat_max_len;自动跳过NULL值,全NULL时返回NULL,须用IFNULL等兜底。
直接用 GROUP_CONCAT() 就行,但默认长度 1024 字节、自动跳过 NULL、必须配合 GROUP BY —— 这三点不处理,结果大概率错或不全。
它不是普通字符串函数,而是聚合函数,行为完全取决于分组逻辑:
GROUP BY department:每部门生成一条拼接结果GROUP BY:整张表当一个组,只返回单行(适合生成全局列表,但容易误判为“全量拼对了”)sql_mode=only_full_group_by 下,SELECT department, GROUP_CONCAT(name) 会报错,除非 department 在 GROUP BY 中显式出现默认值 1024 是字节数,不是字符数。含中文、emoji 时,10 个汉字就可能超限:
SELECT @@group_concat_max_len;
SET SESSION group_concat_max_len = 1000000;
DISTINCT、ORDER BY、SEPARATOR 是三个常用修饰项,语法顺序固定:
GROUP_CONCAT(DISTINCT name ORDER BY id DESC SEPARATOR ' | ')
DISTINCT 必须最前,ORDER BY 必须在 SEPARATOR 前,写反会报语法错误SEPARATOR '';想用换行符,得写 SEPARATOR 'n'(注意引号)ORDER BY created_at 比用 ORDER BY CAST(id AS CHAR) 更稳GROUP_CONCAT() 对 NULL 是静默跳过,既不报错也不占位:
NULL,结果是 NULL,不是空字符串 —— 前端 IFNULL() 或后端判空别漏NULL 显示成 '(none)':GROUP_CONCAT(IFNULL(phone, '(none)') SEPARATOR ', ')
name 和 dept)必须用 CONCAT() 包一层:GROUP_CONCAT(CONCAT(name, '(', dept, ')')),不能直接 GROUP_CONCAT(name, dept)
真正麻烦的不是语法本身,而是你没意识到:拼接结果是 TEXT 类型,没法走索引做 LIKE 模糊查;想搜“包含某个 tag”,得回到原表字段上加条件,而不是在拼完的字符串里找。