mysql JSON_ARRAYAGG联合JSON_OBJECT使用查询整合(数组对象)字段
父表数据(表名:class)
id | name |
1 | 一年级 |
2 | 二年级 |
3 | 三年级 |
子表数据(表名:students)
id | name | classId |
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;
查出来的数据
id | name | students |
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
查出来的数据
classId | students |
1 | [{"id": 11, "name": "张三"}, {"id": 12, "name": "李四"}] |
2 | [] |
3 | [{"id": 13, "name": "小明"}] |