You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL如何将GROUP_CONCAT输出转为JSON数组适配Sequelize自动解析

解决MySQL查询部门对应团队JSON数组的问题

前提假设

先明确表结构示例,方便对齐字段:假设你使用的部门团队映射表名为dept_team_mapping,核心字段如下:

  • dept_code:部门编码,对应示例中的depA、depB
  • team_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 00:15:03