mysql中的json字段中存了一个数组,要将这个数组中符合条件的数据取出来,
数据库结构如下:
CREATE TABLE `school` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '学校名称',
`json_info` json DEFAULT NULL COMMENT '班级学生信息',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
初始化数据:
INSERT INTO school (name,json_info) VALUES
('春风小学','[{"class": "三年一班", "students": [{"name": "张三", "address": "上海市浦东新区张江"}, {"name": "李四", "address": "上海市浦东新区张江"}]}, {"class": "三年二班", "students": [{"name": "王五", "address": "上海市静安区"}, {"name": "赵六", "address": "上海市卢湾区"}]}]');
json_info结构如下
[
{"class": "三年一班", "students": [{"name": "张三", "address": "上海市浦东新区张江"},{"name": "李四", "address": "上海市浦东新区张江"}]},
{"class": "三年二班", "students": [{"name": "王五", "address": "上海市静安区"},{"name": "赵六", "address": "上海市卢湾区"}]}
]
此时需将所有的学生的数据取出来。
思路:将json中的数组转成一个临时表
实现: 使用mysql中的JSON_TABLE对数据进行处理
SELECT s.id,s.name,ss.name,ss.address FROM school s
CROSS JOIN
JSON_TABLE(
json_info,
'$[*]' COLUMNS (NESTED PATH '$.students[*]' COLUMNS(name VARCHAR(100) PATH '$.name', address VARCHAR(100) PATH '$.address'))
) AS ss
WHERE json_info IS NOT NULL;
执行结果如下
说明:json_info 是 recipe表中的json字段
students是json_info中的数组
name 和address 为students 数组中对象中的两个属性,取出来变成name 和address两列
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)