当前位置: 首页 > 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.classIdGROUP 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等方法时使用)

SELECTu.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": "小明"}]


http://www.mrgr.cn/news/96633.html

相关文章:

  • RKNN SDK User Guide学习要点
  • 蓝桥杯15届JAVA_A组
  • 【QT5 网络编程示例】TCP 通信
  • Kong网关研究
  • 【Unity】记录TMPro使用过程踩的一些坑
  • Spark,上传文件
  • HTML中数字和字母不换行显示
  • 数据结构和算法(十一)--图
  • 去中心化稳定币机制解析与产品策略建议
  • ros2--xacro
  • Python-八股总结
  • 【群智能算法改进】一种改进的蜣螂优化算法IDBO[3](立方混沌映射Cubic、融合鱼鹰勘探策略、混合高斯柯西变异)【Matlab代码#92】
  • 【MVC简介-产生原因、演变历史、核心思想、组成部分、使用场景】
  • 【Pandas】pandas Series to_markdown
  • 六种光耦综合对比——《器件手册--光耦》
  • 十五届蓝桥杯省赛Java B组(持续更新..)
  • ISIS【路由协议讲解】-通俗易懂!
  • 汇编学习之《数据传输指令》
  • Sentinel[超详细讲解]-1
  • JAVASE(十二)常用类(一)Object类