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
相关产品推荐
相关产品推荐

