如何将MySQL返回的多行记录按staff合并province字段?
MySQL 按staff分组合并province为逗号分隔字符串的实现方法
直接用MySQL内置的GROUP_CONCAT()函数就能搞定,这是处理分组合并字符串最常用的方案,具体用法如下:
基础实现
假设你的表名为your_table,执行以下SQL即可按staff分组,把对应多个province合并成逗号分隔的字符串:
SELECT staff, GROUP_CONCAT(province) AS provinces FROM your_table GROUP BY staff;
默认情况下,GROUP_CONCAT()会用逗号作为分隔符,如果你想让分隔后更易读(比如变成广东, 广西而不是广东,广西),可以自定义分隔符:
SELECT staff, GROUP_CONCAT(province SEPARATOR ', ') AS provinces FROM your_table GROUP BY staff;
进阶优化
- 去重合并:如果同一staff下有重复的province记录,想合并后只保留唯一值,加上
DISTINCT关键字即可:
SELECT staff, GROUP_CONCAT(DISTINCT province SEPARATOR ', ') AS provinces FROM your_table GROUP BY staff;
- 指定排序顺序:如果需要合并后的province按特定逻辑排序(比如按id升序),可以在函数内添加
ORDER BY:
SELECT staff, GROUP_CONCAT(province ORDER BY id ASC SEPARATOR ', ') AS provinces FROM your_table GROUP BY staff;
- 处理长度限制:
GROUP_CONCAT()默认有1024字节的长度限制,合并后的字符串过长会被截断。可以临时调整会话级的限制:
SET SESSION group_concat_max_len = 102400; -- 设置为100KB,可按需调整数值
如果需要永久生效,修改MySQL配置文件(如my.cnf或my.ini),添加以下配置后重启服务:
group_concat_max_len = 102400
示例效果
假设原表数据如下:
| id | staff | province |
|---|---|---|
| 1 | 张三 | 广东 |
| 2 | 张三 | 广西 |
| 3 | 李四 | 江苏 |
| 4 | 李四 | 浙江 |
| 5 | 李四 | 江苏 |
执行带去重的SQL后,返回结果:
| staff | provinces |
|---|---|
| 张三 | 广东, 广西 |
| 李四 | 江苏, 浙江 |
内容的提问来源于stack exchange,提问作者ben
相关产品推荐
相关产品推荐

