• MySQL5.7高级函数:JSON_ARRAYAGG和JSON_OBJECT的使用


    前置准备

    1. DROP TABLE IF EXISTS `t_user`;
    2. CREATE TABLE `t_user`
    3. (
    4. `id` bigint(20) NOT NULL,
    5. `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '姓名',
    6. `relative_ids` json NOT NULL COMMENT '亲人',
    7. `friend_ids` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '朋友',
    8. `sex` int NOT NULL DEFAULT 0 COMMENT '性别 1:男,2:女',
    9. `object_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '对象id',
    10. PRIMARY KEY (`id`) USING BTREE
    11. ) ENGINE = InnoDB
    12. CHARACTER SET = utf8mb4
    13. COLLATE = utf8mb4_general_ci COMMENT = '用户表';
    1. INSERT INTO `t_user` VALUES (1, '张伟', '[]', '3,4', 1, 5);
    2. INSERT INTO `t_user` VALUES (2, '李明', '[4, 5]', '', 1, 0);
    3. INSERT INTO `t_user` VALUES (3, '王强', '[]', '', 1, 4);
    4. INSERT INTO `t_user` VALUES (4, '雨婷', '[]', '', 2, 3);
    5. INSERT INTO `t_user` VALUES (5, '蕾蕾', '[]', '', 2, 1);
    1. DROP TABLE IF EXISTS `t_hobby`;
    2. CREATE TABLE `t_hobby`
    3. (
    4. `id` bigint(20) NOT NULL,
    5. `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '爱好',
    6. PRIMARY KEY (`id`) USING BTREE
    7. ) ENGINE = InnoDB
    8. CHARACTER SET = utf8mb4
    9. COLLATE = utf8mb4_general_ci COMMENT = '爱好表';
    1. INSERT INTO `t_hobby` VALUES (1, '篮球');
    2. INSERT INTO `t_hobby` VALUES (2, '足球');
    3. INSERT INTO `t_hobby` VALUES (3, '游泳');
    4. INSERT INTO `t_hobby` VALUES (4, '跑步');
    5. INSERT INTO `t_hobby` VALUES (5, '健身');
    6. INSERT INTO `t_hobby` VALUES (6, '音乐');
    7. INSERT INTO `t_hobby` VALUES (7, '旅行');
    8. INSERT INTO `t_hobby` VALUES (8, '读书');
    9. INSERT INTO `t_hobby` VALUES (9, '电影');
    10. INSERT INTO `t_hobby` VALUES (10, '游戏');
    11. INSERT INTO `t_hobby` VALUES (11, '绘画');
    12. INSERT INTO `t_hobby` VALUES (12, '摄影');
    13. INSERT INTO `t_hobby` VALUES (13, '写作');
    14. INSERT INTO `t_hobby` VALUES (14, '编程');
    15. INSERT INTO `t_hobby` VALUES (15, '烹饪');
    16. INSERT INTO `t_hobby` VALUES (16, '园艺');
    17. INSERT INTO `t_hobby` VALUES (17, '钓鱼');
    18. INSERT INTO `t_hobby` VALUES (18, '滑雪');
    19. INSERT INTO `t_hobby` VALUES (19, '滑冰');
    20. INSERT INTO `t_hobby` VALUES (20, '登山');
    1. DROP TABLE IF EXISTS `t_user_hobby`;
    2. CREATE TABLE `t_user_hobby`
    3. (
    4. `id` bigint(20) NOT NULL,
    5. `user_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '用户id',
    6. `hobby_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '爱好id',
    7. PRIMARY KEY (`id`) USING BTREE
    8. ) ENGINE = InnoDB
    9. CHARACTER SET = utf8mb4
    10. COLLATE = utf8mb4_general_ci COMMENT = '用户爱好关联表';
    1. INSERT INTO `t_user_hobby` VALUES (1, 1, 1);
    2. INSERT INTO `t_user_hobby` VALUES (2, 1, 2);
    3. INSERT INTO `t_user_hobby` VALUES (3, 2, 3);
    4. INSERT INTO `t_user_hobby` VALUES (4, 2, 12);
    5. INSERT INTO `t_user_hobby` VALUES (5, 3, 10);
    6. INSERT INTO `t_user_hobby` VALUES (6, 3, 4);
    7. INSERT INTO `t_user_hobby` VALUES (7, 3, 5);
    8. INSERT INTO `t_user_hobby` VALUES (8, 4, 7);
    9. INSERT INTO `t_user_hobby` VALUES (9, 4, 1);
    10. INSERT INTO `t_user_hobby` VALUES (10, 5, 10);

    数据分析

    1、王强和雨婷、张伟和蕾蕾互为情侣

    2、王强和雨婷都是张伟的朋友

    3、雨婷和蕾蕾都是李明的亲人  

    4、张伟的爱好分别是:1:篮球、2:足球

    李明的爱好分别是:3:游泳、12:摄影

    王强的爱好分别是:10:游戏、4:跑步、5:健身

    雨婷的爱好分别是:7:旅行、1:篮球

    蕾蕾的爱好分别是:10:游戏

    需求实现

    1、查询出“李明”的个人信息以及他的亲人信息

    1. SELECT
    2. usr.id,
    3. usr.NAME,
    4. usr.relative_ids,
    5. (
    6. SELECT
    7. JSON_ARRAYAGG( JSON_OBJECT( 'id', relative.id, 'name', relative.NAME ) )
    8. FROM
    9. t_user relative
    10. WHERE
    11. relative.id IN ( SELECT relative_ids.id FROM JSON_TABLE ( usr.relative_ids, '$[*]' COLUMNS ( id BIGINT PATH '$' ) ) AS relative_ids )
    12. ) AS relative_infos,
    13. usr.friend_ids,
    14. usr.sex,
    15. usr.object_id
    16. FROM
    17. t_user usr
    18. WHERE
    19. id = 2

    2、查询出“张伟”的个人信息以及他的朋友信息

    1. SELECT
    2. usr.id,
    3. usr.NAME,
    4. usr.relative_ids,
    5. usr.friend_ids,
    6. (
    7. SELECT
    8. JSON_ARRAYAGG( JSON_OBJECT( 'id', friend.id, 'name', friend.NAME ) )
    9. FROM
    10. t_user friend
    11. WHERE
    12. FIND_IN_SET( friend.id, usr.friend_ids ) > 0
    13. ) AS friend_infos,
    14. usr.sex,
    15. usr.object_id
    16. FROM
    17. t_user usr
    18. WHERE
    19. id = 1

    3、查询出“有对象”的个人信息以及他(她)的对象信息

    1. SELECT
    2. usr.id,
    3. usr.NAME,
    4. usr.relative_ids,
    5. ( SELECT JSON_OBJECT( 'id', object.id, 'name', object.NAME ) FROM t_user object WHERE object.id = usr.object_id ) AS object_info,
    6. usr.friend_ids,
    7. usr.sex,
    8. usr.object_id
    9. FROM
    10. t_user usr
    11. WHERE
    12. usr.object_id != 0

    4、查询出所有用户的爱好信息

    1. SELECT
    2. usr.id,
    3. usr.NAME,
    4. usr.relative_ids,
    5. usr.friend_ids,
    6. usr.sex,
    7. usr.object_id,
    8. (
    9. SELECT
    10. JSON_ARRAYAGG(
    11. JSON_OBJECT( 'id', hobby.id, 'name', hobby.NAME ))
    12. FROM
    13. t_hobby hobby
    14. LEFT JOIN t_user_hobby user_hobby ON user_hobby.hobby_id = hobby.id
    15. WHERE
    16. user_hobby.user_id = usr.id
    17. ) AS hobby_infos
    18. FROM
    19. t_user usr

    备注

    mysql的版本必须要>=5.7

  • 相关阅读:
    深度学习:使用UNet做图像语义分割,训练自己制作的数据集,详细教程
    计算 tensorflow 和 pytorch 模型的浮点运算数
    【前端】TypeScript核心知识点讲解
    【FFMPEG】Windows下将ffmpeg编译成lib和dll完整教程
    Route53 – Part 1
    Java中的继承——详解
    catalog database 的配置
    滑动窗口 ( 单调队列 )
    5大LOGO免费在线生成器,从此设计不求人!
    【Docker】Docker持续集成与持续部署(四)
  • 原文地址:https://blog.csdn.net/weixin_55076626/article/details/133330969