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

MySQL Workbench创建含JSON数组的JSON对象报错1242求助

解决MySQL Error Code: 1242 子查询返回多行的问题

这个报错我之前也碰到过!问题出在你嵌套的子查询上——当一个老师对应多条class_codes记录时,那个子查询会返回多行结果,但JSON_OBJECT的每个属性只能接收单个值,所以MySQL就抛出了1242错误。

核心解决方案:用JSON_ARRAYAGG()聚合多行结果为JSON数组

MySQL提供了JSON_ARRAYAGG()函数,专门用来把多行数据聚合为一个JSON数组。你需要把原来的子查询改成用这个函数来打包每个老师对应的所有class_codes记录,这样子查询就会返回单个(数组类型的)值,完美适配JSON_OBJECT的要求。

修改后的SQL语句如下:

SELECT 
  JSON_OBJECT(
    'id', id,
    'username', username,
    'email', email,
    'firstname', firstname,
    'lastname', lastname,
    'password', password,
    'created', created,
    'class_codes', (
      SELECT JSON_ARRAYAGG(
        JSON_OBJECT(
          'id', id,
          'code', code,
          'created', created,
          'fk_teacher', fk_teacher
        )
      ) 
      FROM class_codes 
      WHERE fk_teacher = teachers.id
    )
  ) AS teacher_with_classes
FROM teachers 
-- 保留你原本的WHERE条件,比如 WHERE teachers.id = 1 或其他筛选逻辑
WHERE ...;

关键细节说明:

  • 内层的JSON_OBJECT():把class_codes表的每条记录转换成一个独立的JSON对象,确保每条班级代码的字段结构清晰。
  • JSON_ARRAYAGG():将所有属于当前老师的班级代码JSON对象聚合为一个数组,即使某个老师没有对应的班级代码,也会返回NULL(不会报错)。
  • 这个方案要求MySQL版本在5.7及以上,因为JSON_ARRAYAGG()是5.7版本引入的JSON函数。

内容的提问来源于stack exchange,提问作者Jinesh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:22:13