当前位置: 首页 > news >正文

mysql JSON_ARRAYAGG联合JSON_OBJECT使用查询整合(数组对象)字段

父表数据(表名:class)
idname
1一年级
2二年级
3三年级
子表数据(表名:students)
idnameclassId
11张三1
12李四1
13小明3

关联子表sql查询(推荐使用方法一)

方法一 (使用IFNull判断子表数据是否为空,为空的话使用JSON_ARRAY显示空数组):

JSON_ARRAYAGG 是 MySQL 5.7.22+ 和 MySQL 8.0+ 版本支持的 JSON 聚合函数。具体支持情况如下:

版本是否支持 JSON_ARRAYAGG
MySQL 5.7.22+   ✅ 支持(5.7.22 引入)
MySQL 8.0+ ✅ 支持(默认可用)
MariaDB 10.5+ ✅ 支持(类似 MySQL 8.0)
MySQL 5.7.21 及更早版本 ❌ 不支持
SELECT   
    u.id,  
    u.name,  
    IFNULL(  
        (
           SELECT JSON_ARRAYAGG(  
             JSON_OBJECT('id', o.id, 'name', o.name)  
           )  
           FROM students o   
           WHERE o.classId = u.id
        ),  
        JSON_ARRAY()  
    ) AS students
FROM   
    class u;  

方法二

SELECT   
    u.id,   
    u.name,   
  IF(  
        COUNT(o.id) = 0, 
        JSON_ARRAY(),  
        JSON_ARRAYAGG(  
            JSON_OBJECT(  
                'id', o.id,   
                'name', o.name  
            )  
        )  
    ) AS students
FROM   
    class u   
LEFT JOIN   
    students o ON u.id = o.classId
    GROUP BY   
    u.id;

方法三(不支持JSON_ARRAYAGG,JSON_ARRAY,JSON_OBJECT等方法时使用)

SELECT   
    u.id,  
    u.name,  
    IFNULL(  
        (  
            SELECT GROUP_CONCAT(  
                CONCAT('{"id":"', o.id, '","name":"', o.name, '"}')  
            )  
            FROM students o   
            WHERE o.classId = u.id  
        ),  
        '[]'  
    ) AS students  
FROM   
    class u;  

查出来的数据

idnamestudents
1一年级[{"id": 11, "name": "张三"}, {"id": 12, "name": "李四"}]
2二年级[]
3三年级[{"id": 13, "name": "小明"}]
单独查询students表

方法一

SELECT   
    u.classId,  
    JSON_ARRAYAGG(  
        JSON_OBJECT('id', u.id, 'name', u.name)  
    ) AS students  
FROM   
    students u
group by u.classId;  

方法二(不支持JSON_ARRAYAGG,JSON_ARRAY,JSON_OBJECT等方法时使用)

SELECT
    u.classId,
    CONCAT('[',
         GROUP_CONCAT(
               CONCAT('{"id":"', u.id, '","name":"', u.name, '"}')
             ),
         ']') AS students
FROM students u
GROUP BY u.classId

查出来的数据

classIdstudents
1[{"id": 11, "name": "张三"}, {"id": 12, "name": "李四"}]
2[]
3[{"id": 13, "name": "小明"}]

相关文章:

  • “钉耙编程”2025春季联赛(2)题解(更新中)
  • 在 Cloud Run 上使用 Gemini API 构建聊天应用
  • linux 服务器创建服务器启动后服务自启动
  • 突破反爬困境:SDK开发,浏览器模块(七)
  • 汇编学习之《标志寄存器》
  • 音视频基础(图像的基础概念)
  • 5.2.1 WPF 通过ItemControl自己做柱状图
  • 英飞凌 TC3xx功能安全开发-MONBIST
  • Redis:List 类型 内部实现、命令及应用场景
  • 探秘Transformer系列之(21)--- MoE
  • 微前端实现方案对比Qiankun VS npm组件
  • EviMed:左手综述内容,右手参考文献!三步产出可溯源的万字医学综述!
  • python系统之综合案例:用python打造智能诗词生成助手
  • 【Python使用】嘿马python数据分析教程第1篇:Excel的使用,一. Excel的基本使用,二. 会员分析【附代码文档】
  • hadoop集群配置-scp命令
  • CTF类题目复现总结-[MRCTF2020]Hello_ misc 1
  • 分治算法之凸包问题
  • 解决ant-ui 表单校验通过但是未清楚校验提示的bug 示例
  • LeetCode算法题(Go语言实现)_21
  • 《C++知识点之拷贝构造函数》
  • html新闻列表/百度关键词相关性优化软件
  • public cms网站建设/深圳网站seo优化
  • 南宁做网约车司机要求/天津seo外包团队
  • 成都网站改版优化/广州外贸推广
  • 百度推广要自己做网站吗/百度收录查询
  • 石家庄定制建站/企业宣传册模板