SQL多表分组查询GROUP_CONCAT拼接结果缺少前导分隔符问题求助
问题根因
该问题的核心是GROUP_CONCAT函数默认会忽略分组内的NULL值,不会将其纳入拼接范围:
- 版本ver1对应两条changelog记录(id=1、id=2)
- 其中changelog id=1没有关联到postprocessors表的对应记录,
p.name取值为NULL - 分组拼接时NULL被过滤,仅剩下
PostProc1一个有效值,分隔符仅会在多个有效值之间生成,因此最终结果没有分隔符,不符合预期。
解决方案
修改GROUP_CONCAT逻辑,使用IFNULL将NULL值替换为空字符串,让空值也参与拼接即可,建议同时对其他可能出现NULL的关联字段做相同处理,避免其他字段也出现类似问题:
SELECT GROUP_CONCAT(cl.description SEPARATOR '¤') AS description, GROUP_CONCAT(t.name SEPARATOR '¤') AS sign, GROUP_CONCAT(IFNULL(c.name, '') SEPARATOR '¤') AS comp, GROUP_CONCAT(IFNULL(p.name, '') SEPARATOR '¤') AS postp, v.version, v.date FROM changelog cl INNER JOIN versions v ON cl.version = v.id INNER JOIN cl_type_conn clt ON clt.changelog = cl.id LEFT JOIN cl_comp_conn cc ON cc.changelog = cl.id LEFT JOIN cl_postproc_conn cp ON cp.changelog = cl.id INNER JOIN types t ON t.id = clt.type LEFT JOIN companies c ON c.id = cc.company LEFT JOIN postprocessors p ON p.id = cp.postprocessor GROUP BY cl.version
修改后版本ver1的postp字段结果为¤PostProc1,符合需求。
内容的提问来源于stack exchange,提问作者Csanesz
相关产品推荐
相关产品推荐

