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

场景描述

  • 假设数据库中有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
}

插件文档

插件文档地址

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Notion使用详解

​ ​ 您好,我是程序员小羊! 前言 Notion是一款集笔记、任务管理、知识库、文档协作等多功能于一体的生产力工具。其灵活性和可定制性使得它在个人和团队协作中都非常受欢迎。本教程将详细介绍如何使用Notion的基本功能,帮助你快速上手并充分…

【云原生】Ingress控制器超级详解

Ingress资源对象 文章目录 Ingress资源对象一、Ingress1.1、Ingress是什么?1.2、Ingress术语1.3、Ingress类型 二、Ingress详细2.1、部署Nginx-Ingress控制器2.2、最小Ingress资源2.3、Ingress规则 三、一个域名多个访问路径多SVC四、多域名Ingress五、转发到默认Se…

【C语言小项目】五子棋游戏

目录 前言 一、游戏规则 1.功能分析 2.玩法分析 3.胜负判定条件 二、游戏实现思路 三、代码实现与函数封装 1.项目文件创建 2.头文件说明 3.函数封装 1)菜单实现 2)进度条实现 3)main函数实现 4)Game函数 5&#xff0…

【系统架构设计】软件架构设计(2)

【系统架构设计】软件架构设计(1) 软件架构概述架构需求与软件质量属性软件架构风格层次系统架构风格面向服务的架构SOA概述微服务微服务和SOA差异 软件架构概述 架构需求与软件质量属性 软件架构风格 层次系统架构风格 面向服务的架构 SOA概述 面…

C语言手撕实战代码_循环单链表和循环双链表

C语言手撕实战代码_循环单链表和循环双链表 循环单链表习题1.建立带头结点的循环链表2.设计一个算法,将一个带有头结点的循环单链表中所有结点的链接方向逆转3.设计一个算法,将一个循环单链表左移k个结点4.设计一个算法将循环单链表中的结点p的直接前驱删除5.设计算…

游泳耳机品牌前十名哪个牌子好?如何选高配游泳耳机不花冤枉钱?

在快节奏的现代生活中,音乐已成为许多人放松和充电的重要方式之一。无论是晨跑、通勤还是健身,音乐总能陪伴我们度过每一个瞬间。而对于游泳爱好者来说,能够在水中享受音乐,更是将这一运动提升到了一个新的层次。然而,…

uniapp/uniapp x总结

uni-app组成和跨端原理 上图所诉 App的渲染引擎:同时提供了2套渲染引擎,.vue页面文件由webview渲染,原理与小程序相同;.nvue页面文件由原生渲染,原理与react native相同。开发者可以根据需要自主选择渲染引擎。 uniapp…

【unity小技巧】获取免费开源的人物模型,并为obj fbx人物模型绑定骨骼、动画——mixamo的使用介绍

文章目录 前言地址上传自己的3D角色下载单动画下载动作包角色模型导入Unity动画导入unity设置动画骨骼动画骨骼不配的问题参考完结 前言 其实前面我已经推荐了几种获取人物模型的方法: 1、【unity小技巧】下载原神模型,在Blender中PMX模型转FBX模型&…

多商户商品下单限购问题修复

问题: 当商品设置限购为 1 时,够买数量未超过限购,但是还是提示超出限购数量 修复方法: 修改代码路径: app\common\repositories\store\order\StoreOrderCreateRepository.php 修改代码一: i s p a y s a r r a y u n i q u e ( a r r a y c o l u m n ( is_pays array_un…

Python 设置Excel工作表页边距、纸张大小/方向、打印区域、缩放比例

在使用Excel进行数据分析或报告制作时,页面设置是确保最终输出效果专业、美观的关键步骤。合理的页面设置不仅能够优化打印效果,还能提升数据的可读性。本文将详细介绍如何使用Python操作Excel中的各项页面设置功能。 目录 Python 设置Excel工作表页边…

AutosarMCAL开发——基于EB FEE驱动

这目录 1. FEE原理2.EB配置以及接口应用3.总结 1. FEE原理 在Fls解析文章中介绍了Flash与EEPROM储存器的区别,本文将介绍FEE具体实现原理。 FEE模块,全称Flash EEPROM Emulation Module,旨在使用Flash模拟EEPROM以增加使用寿命。 术语解释 p…

CTFHUB | web进阶 | JSON Web Token | 无签名

一些JWT库也支持none算法,即不使用签名算法。当alg字段为空时,后端将不执行签名验证 开启题目 账号密码随便输,登录之后显示只有 admin 可以获得 flag 在此页面抓包发到 repeater,这里我们需要用到一个 Burp 插件,按图…

瑞吉外卖-登录时报错:接口404异常

一、错误描述 出现“系统接口404异常”的弹窗,同时一直显示登录中,而无法跳转到后台页面。 二、解决方法 1. 检查浏览器的网址 确保为localhost:8080/backend/page/login/login.html,而不是idea自动生成的,修改过来即可。 2.确…

Unity XR Interaction Toolkit 通过两个手柄控制物体放大缩小

1:给物体添加 XR General Grab Transformer 脚本 2:XR Grab Interactable 的 select mode 选择 Multiple

SpringIoCDI

前言👀~ 上一章我们介绍了Spring MVC,今天介绍Spring核心功能之一IoC Spring到底是什么? Spring IoC 什么是 IoC 容器? IoC 介绍 DI 介绍 IoC详解 获取Bean对象的其他方式 Bean的存储 方法注解 Bean 扫描路径 DI详解 …

拼图游戏02

文章目录 概要整体架构流程代码过程小结 概要 现在需要将图片添加界面中 关键点在于它如何动态地根据游戏状态更新用户界面。它使用了Swing的布局管理器来定位组件,并且通过ImageIcon和JLabel来显示图像。注意,路径字符串中的反斜杠在Java中是转义字符…

选择排序(直接选择排序和堆排序)

一、直接选择排序 1.基本思想 每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 2.动图展示 3.思路讲解 ①在元素集合array[i]—array[n-1]中选择关键码最大&…

以简单的例子从头开始建spring boot web多模块项目(一)

目的:从头梳理,如何手工从头建立多模块项目。 步骤: 1、建立maven项目,类型:maven Archetype,Name:ParentDemo 选择JDK版本,Archetype:org.apache.maven.archetypes:maven-archetype-quickstart…

网络UDP报文详细解析

目录 一、简介二、详细介绍三、其他相关链接1、TCP报文段的详细图总结2、TCP三次握手和四次挥手详解3、socket通信原理及相关函数详细总结4、网络包IP首部详细解析 一、简介 本文主要介绍UDP报文格式。 二、详细介绍 UDP是一种无连接、不可靠的用户数据报协议,其…

《图解设计模式》笔记(四)分开考虑

九、Bridge模式:将类的功能层次结构与实现层次结构分离 类的两个层次结构和作用 类的功能层次结构:希望增加新功能时 父类有基本功能,在子类中增加新功能 Something父类 …├─SomethingGood子类 想要再增加新功能 Something父类 …├─So…