DBAPI如何用SQL将多表关联查询出树状结构数据(嵌套JSON格式)

news2024/11/13 13:04:58

场景描述

  • 假设数据库中有3张表如下:

客户信息表

图片


订单表

图片

订单详情表

图片

一个客户有多个订单,一个订单包含多个产品信息,客户-订单-产品就构成了3级的树状结构,如何查询出如下树状结构数据呢?

[{
        "customer_age": 50,
        "orders": [{
                "order_phone": "15300000000",
                "order_address": "广东省广州市",
                "order_id": 60001,
                "products": [{
                        "product": "手机",
                        "num": 1
                    }
                ]
            }, {
                "order_phone": "15300000000",
                "order_address": "广东省深圳市",
                "order_id": 60002,
                "products": [{
                        "product": "电脑",
                        "num": 2
                    }, {
                        "product": "足球",
                        "num": 1
                    }
                ]
            }
        ],
        "customer_name": "刘德华",
        "customer_id": 5001
    }, {
        "customer_age": 20,
        "orders": [{
                "order_phone": "13200000000",
                "order_address": "上海市",
                "order_id": 60003,
                "products": [{
                        "product": "口红",
                        "num": 1
                    }, {
                        "product": "衣服",
                        "num": 2
                    }
                ]
            }
        ],
        "customer_name": "刘亦菲",
        "customer_id": 5002
    }
]

案例实操

数据准备

  • 用SQL关联查询出所有信息

图片

可以看到只要对这个结果进行两次分组,就可以得到树状结构数据了。第一次按customer_id分组,得到一个客户下的所有订单信息,然后对订单信息按order_id分组,得到一个订单下的所有产品信息。这个就是实现思路,DBAPI官方已经提供了插件来进行数据格式转换。

插件安装

  • 从官网进入插件市场

图片

  • 下载高级树状结构数据插件

图片

  • 将下载的插件放入DBAPI安装目录下的lib目录并重启DBAPI即可

创建API

  • 填写关联查询的SQL语句,选择插件并填写插件参数如下:

[{
        "groupBy": "customer_id",
        "childrenName": "orders",
        "fields": ["customer_name", "customer_age"]
    }, {
        "groupBy": "order_id",
        "childrenName": "products",
        "fields": ["order_address", "order_phone"]
    }
]

图片

插件参数的意思就是第一次按customer_id分组,得到一个客户下的所有订单信息并命名为 orders ,同时取出 customer_name customer_age 两个属性;

然后对订单信息按order_id分组,得到一个订单下的所有产品信息并命名为 products,同时取出 order_address order_phone 两个属性;

最后一级(第三级)就是订单中的所有产品信息,有哪些字段就是取决于SQL查询出的所有字段去除掉前面父级用掉的字段后,剩下的字段。

测试数据

  • 发送请求可以看到数据已经按照树状结构返回了

图片

  • 数据格式化后如下

{
    "data": [{
            "customer_age": 50,
            "orders": [{
                    "order_phone": "15300000000",
                    "order_address": "广东省广州市",
                    "order_id": 60001,
                    "products": [{
                            "product": "手机",
                            "num": 1
                        }
                    ]
                }, {
                    "order_phone": "15300000000",
                    "order_address": "广东省深圳市",
                    "order_id": 60002,
                    "products": [{
                            "product": "电脑",
                            "num": 2
                        }, {
                            "product": "足球",
                            "num": 1
                        }
                    ]
                }
            ],
            "customer_name": "刘德华",
            "customer_id": 5001
        }, {
            "customer_age": 20,
            "orders": [{
                    "order_phone": "13200000000",
                    "order_address": "上海市",
                    "order_id": 60003,
                    "products": [{
                            "product": "口红",
                            "num": 1
                        }, {
                            "product": "衣服",
                            "num": 2
                        }
                    ]
                }
            ],
            "customer_name": "刘亦菲",
            "customer_id": 5002
        }
    ],
    "msg": null,
    "success": true
}

插件文档

插件文档地址

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2051904.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

矩阵--旋转图像

给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 : 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&a…

嵌入式Day33---Linux软件编程---网络编程

目录 一、TCP包头 1.1.源端口 1.2.目的端口 1.3.序号 1.4.确认号 1.5.数据偏移 1.6.保留 1.7.指令信号 1.SYN 2.ACK 3.FIN 4.RST 5.PSH 6.URG 1.8.窗口 1.9.校验和 1.10.紧急指针 二、TCP的过程 2.1三次握手 2.2.传输数据 ​编辑 2.3.四次挥手 ​编辑 …

SpringBoot依赖之Spring Data Redis 一 List 类型

概念 Spring Data Redis (AccessDriver) 依赖名称: Spring Data Redis (AccessDriver)功能描述: Advanced and thread-safe Java Redis client for synchronous, asynchronous, and reactive usage. Supports Cluster, Sentinel, Pipelining, Auto-Reconnect, Codecs and muc…

[Qt][QSS][下]详细讲解

目录 1.样式属性0.前言1.盒模型(Box Model) 2.常用控件样式属性1.按钮2.复选框3.单选框4.输入框5.列表6.菜单栏7.注意 1.样式属性 0.前言 QSS中的样式属性⾮常多,不需要都记住,核⼼原则是⽤到了就去查 ⼤部分的属性和CSS是⾮常相似的 QSS中有些属性&am…

Linux CentOS手动安装Node.js(图文教程)

本章教程主要介绍如何在centos7上安装指定版本的Node.js 一、下载nodejs 前往Node.js官网,根据自己需要安装的版本进行下载。 官网下载地址:https://nodejs.org/zh-cn/download/prebuilt-binaries 本文,以v14.21.3版本介绍整个安装过程。 二、…

<STC32G12K128入门第十步>USB HID键盘

前言 最近公司的一款低功耗的遥控器涉及到使用USB HID的功能,就是需要将BLE蓝牙读取的IC卡的数据在通过USB接口上传到电脑的记事本上面。 一、USB HID是啥? USB HID类是USB设备的一个标准设备类,包括的设备非常多。HID类设备定义它属于人机交互操作的设备,用于控制计算机…

IDEA 导入 RocketMQ 源码

目录 前言一、RocketMQ 架构二、环境准备三、下载源码四、编译源码4.1 导入源码4.2 目录结构4.3 运行程序1. 启动 Namesrv2. 启动 Broker3. 启动 Producer4. 启动 Consumer 五、监控平台的搭建5.1 下载 console 源码5.2 IDEA 启动 前言 最近项目中有个功能需要在本地调试下 Ro…

SAM2论文核心速览

官方博客: https://ai.meta.com/blog/segment-anything-2/ 官方论文:​​​​​​https://ai.meta.com/research/publications/sam-2-segment-anything-in-images-and-videos/ 一、研究背景 研究问题:这篇文章要解决的问题是如何在图像和视频…

公式编辑器 -vue-formula-editor

前言 公式编辑旨在帮助用户使用可视化的前提,能便捷的使用平台,例如低代码平台使用广泛 vue-formula-editor vue-formula-editor是一款开源的Vue公式计算组件,可以帮助开发者快速集成公式编辑 在线体验 demo & 源码 安装 npm i vue-form…

CentOS 上安装 Java 17

要在 CentOS 上安装 Java 17,您可以使用多种方法。这里我将向您展示如何通过下载 Oracle 提供的 Java 开发工具包 (JDK) 或使用其他开源 JDK 版本(如 Adoptium 或 OpenJDK)来完成安装。 方法一:使用 Oracle JDK 17 下载 JDK 17&a…

HTB-BoardLight靶机笔记

BoardLight靶机笔记 概述 HTB的靶机BoardLight 靶机地址:https://app.hackthebox.com/machines/BoardLight 一、nmap扫描 1)端口扫描 -sT tcp全连接扫描 --min-rate 以最低速率10000扫描 -p- 扫描全端口 sudo nmap -sT --min-rate 10000 -p- -o p…

【论文写作】怎么写一篇学术论文

文章目录 (一)非匀速地写论文(二)弄清期刊的投稿要求以及使用论文模板(三)论文各个部分撰写的顺序(四)图表比你想象中的要重要许多(五)结果和讨论&#xff08…

Java | Leetcode Java题解之第349题两个数组的交集

题目: 题解: class Solution {public int[] intersection(int[] nums1, int[] nums2) {Arrays.sort(nums1);Arrays.sort(nums2);int length1 nums1.length, length2 nums2.length;int[] intersection new int[length1 length2];int index 0, index…

CPU占用异常分析

文章目录 问题现象二次排查参考资料 问题现象 执行文件解压,执行过程中被kill掉了,两次均如此。 [rootlocalhost demo_2]# gzip -d demo.sql.gz Killed网上查资料,可能是磁盘不足、系统资源不足; 磁盘查看没有问题,内…

Matlab2021b通过CNN、CNN-LSTM模型实现对声音信号的二分类与四分类

1、利用Matlab2021b训练CNN、CNN-LSTM模型,对采集的一维时序信号进行分类二分类与四分类 2. 声音信号每个样本数据长度3001个采样点,对其进行归一化处理 3、CNN时序信号多分类执行结果截图 3.1 二分类: CNN模型: 训练集损失值…

Linux装ifort环境

下载完成之后,需要解压文件 t tar zxvf IPSXE2020u4Linux.tgz 解压完成之后进入文件夹,我们使用GUI界面安装。 键入./install_GUI.sh 启动安装程序 收集用户信息,选择同意或者不同意都可以 这一步需要等待十几秒 核验不通过 这是缺少运行程…

牛客JS题(四十五)数组去重

注释很详细&#xff0c;直接上代码 涉及知识点&#xff1a; set的灵活用法去除的判别标准 题干&#xff1a; 我的答案 <!DOCTYPE html> <html><head><meta charset"UTF-8" /><style>/* 填写样式 */</style></head><bo…

★ C++基础篇 ★ vector 类

Ciallo&#xff5e;(∠・ω< )⌒☆ ~ 今天&#xff0c;我将继续和大家一起学习C基础篇第六章----vector类 ~ 目录 一 vector的介绍及使用 1.1 vector的介绍 1.2 vector的使用 1.2.1 vector的定义 1.2.2 vector iterator 的使用 1.2.3 vector 空间增长问题 1.2.4 vecto…

网站配置了https证书,但浏览器访问时却访问了http

是由于缺少强制将 HTTP 请求重定向到 HTTPS 的规则 # HTTP 到 HTTPS 重定向配置 server {listen 80;server_name www.xlqd.site xlqd.site;return 301 https://$host$request_uri; } # 那么你原来的server块就要删除 listen 80;

【学习笔记】A2X通信的协议(十二)- PC5信令协议数据错误处理

目录 10. 处理未知、未预见和错误的PC5信令协议数据 10.1 总则 10.2 消息过短或过长 10.2.1 消息过短 10.2.2 消息过长 10.3 未知或未预见的消息类型 10.4 非语义性强制信息元素错误 10.5 非命令性消息部分中的未知和未预见的IE 10.5.1 消息中未知的IEI 10.5.2 乱序的…