如何对同列设置不同条件执行GROUP_CONCAT返回逗号分隔字符串
实现方案
完全可以通过给GROUP_CONCAT传入带条件的表达式实现该需求,不需要额外嵌套子查询,核心思路是用CASE WHEN过滤不同group_id对应的my_id值。
假设你的表名为test_table,MySQL环境下的查询语句如下:
SELECT GROUP_CONCAT(CASE WHEN group_id = 1 THEN my_id END SEPARATOR ',') AS ids_with_group_id_of_1, GROUP_CONCAT(CASE WHEN group_id = 2 THEN my_id END SEPARATOR ',') AS ids_with_group_id_of_2 FROM test_table;
实现原理
CASE WHEN group_id = 1 THEN my_id END仅在group_id为1时返回对应my_id,其他场景返回NULL,而GROUP_CONCAT默认会忽略NULL值,所以最终只会拼接符合条件的id- 如果你使用的是PostgreSQL,可替换为
STRING_AGG函数实现,示例如下:
SELECT STRING_AGG(CASE WHEN group_id = 1 THEN my_id::TEXT END, ',') AS ids_with_group_id_of_1, STRING_AGG(CASE WHEN group_id = 2 THEN my_id::TEXT END, ',') AS ids_with_group_id_of_2 FROM test_table;
补充说明
- 需要对拼接的id排序时,可在
CASE表达式后添加排序规则,比如:GROUP_CONCAT(CASE WHEN group_id = 1 THEN my_id END ORDER BY my_id SEPARATOR ',') - MySQL默认
GROUP_CONCAT有长度限制,如果你需要拼接的id数量较多,可提前调整group_concat_max_len参数规避截断问题
内容的提问来源于stack exchange,提问作者iAmSenpai
相关产品推荐
相关产品推荐

