父表數據(表名: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.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;
查出來的數據
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等方法時使用)
SELECTu.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":?"小明"}] |