MySQL如何将GROUP_CONCAT输出转为JSON数组适配Sequelize自动解析
解决MySQL查询部门对应团队JSON数组的问题
前提假设
先明确表结构示例,方便对齐字段:假设你使用的部门团队映射表名为dept_team_mapping,核心字段如下:
dept_code:部门编码,对应示例中的depA、depBteam_code:团队编码,对应示例中的teamAA、teamBA等
原生MySQL实现(MySQL 5.7+ 推荐)
MySQL 5.7及以上版本内置JSON处理函数,无需手动拼接字符串,直接用内置函数就能输出标准JSON格式,Sequelize可以直接识别解析:
方案1:每行对应一个部门,自带JSON格式团队数组
SELECT dept_code AS code, JSON_ARRAYAGG(team_code) AS teams FROM dept_team_mapping GROUP BY dept_code;
查询返回的teams字段本身是MySQL原生JSON类型,Sequelize会自动解析为JS数组,无需额外处理。
方案2:直接返回完整的符合要求的JSON结构
如果需要直接拿到外层包裹的完整数组JSON,可以嵌套聚合函数:
SELECT JSON_ARRAYAGG( JSON_OBJECT( 'code', dept_code, 'teams', JSON_ARRAYAGG(team_code) ) ) AS full_result FROM dept_team_mapping GROUP BY dept_code;
返回的full_result就是你示例要求的完整JSON字符串,Sequelize会直接解析为对应的JS对象数组。
低版本MySQL兼容方案(无内置JSON函数)
如果你的MySQL版本不支持JSON函数,可以用GROUP_CONCAT手动拼接JSON数组格式:
SELECT dept_code AS code, CONCAT('[', GROUP_CONCAT('"', REPLACE(team_code, '"', '\\"'), '"'), ']') AS teams FROM dept_team_mapping GROUP BY dept_code;
注意:这里加了
REPLACE处理团队编码中的双引号,避免JSON格式出错。你需要在Sequelize的模型定义里把teams字段的类型设为JSON,Sequelize会自动把拼接好的字符串转为JS数组。
Sequelize 代码实现示例
直接调用Sequelize的内置函数适配即可:
const result = await DeptTeamMapping.findAll({ attributes: [ ['dept_code', 'code'], [sequelize.fn('JSON_ARRAYAGG', sequelize.col('team_code')), 'teams'] ], group: ['dept_code'], raw: true // 不需要返回模型实例可加该参数,直接拿到原生JS对象 });
执行后得到的result就是你要求的JS对象数组,不需要额外做格式转换。
内容的提问来源于stack exchange,提问作者Uttam
相关产品推荐
相关产品推荐

