三个表联合查询的场景分析-场景1:a表关联了b表和c表

本场景对应情景如下:

三个数据表,一个表的两个字段分别关联了另外两个表各自的id数据,可能包含多个id(两个1对多关联)。

目录

数据表准备

需求1、查询c表的列表数据,要求获得关联的b表中的name(多个)

需求2、在需求1基础上,同时查询关联的a表的name(多个)

需求3、在需求2基础上,增加整体聚合结果按“创建时间”排序、分页


数据表准备

共三张表,a、b、c,c表中关联了a和b的id

demo_bs表

ae822a1d5b33478cb4ad0cb5313eae50.png

demo_as表

f95b2267035949209fa34ea660ccad3a.png

demo_cs表

94cdf3ea6629474e988878aaf548c287.png

a_ids:关联的a表的id列表,使用英文逗号分隔;可不关联a,不关联时为空字符串;

b_ids:关联的b表的id列表,使用英文逗号分隔;必定关联了b中的某些id,至少关联了1个;

需求1、查询c表的列表数据,要求获得关联的b表中的name(多个)

         select c.id AS id,c.name AS name,c.created_at AS createdAt,c.b_ids as bIDs, c.a_ids as aIDs, group_concat(b.name SEPARATOR ',')  as bNamesfrom demo_cs  cleft join demo_bs  bon FIND_IN_SET(b.id, c.b_ids) > 0where c.name like '%c%'group by c.id

查询结果

b30c61afa3234824a9860ad3ae7cb19b.png

其中where c.name like '%c%'为c表本表的name字段查询条件。

FIND_IN_SET(b.id, c.b_ids) > 0表示检查b.id值在c.b_ids中的索引(且后者是以逗号拼接的字符串),索引从1开始,因此判断结果只要>0则表示前者在后者中存在。

group_concat(b.name SEPARATOR ',')表示将b表的name字段以逗号拼接作为新的一列,那么是b表的哪些name呢?即符合on FIND_IN_SET(b.id, c.b_ids) > 0 条件的记录的name。

需求2、在需求1基础上,同时查询关联的a表的name(多个)

select r.id,r.name,r.createdAt,r.bIDs as bIDs,r.bNames as bNames,r.aIDs as aIDs,group_concat(a.name SEPARATOR ',') as aNamesfrom(select c.id AS id,c.name AS name,c.created_at AS createdAt,c.b_ids as bIDs, c.a_ids as aIDs, group_concat(b.name SEPARATOR ',')  as bNamesfrom demo_cs  cleft join demo_bs  bon FIND_IN_SET(b.id, c.b_ids) > 0where c.name like '%c%'group by c.id) rleft join demo_as aon FIND_IN_SET(a.id, r.aIDs) > 0where  r.bNames like '%b%'group by r.id

查询结果

ae5a3a1db82d4da2baad1d92c502c8ca.png

其中where  r.bNames like '%b%'为聚合后数据的b的名称列表的查询条件。此时用于在内部查询基础上如

b5_hello,bb3,b2

中(即bNames)判断是否包含b。如果将此条件放在子查询内部:如

where  b.name like '%b%'

会导致数据不准确,b.name like查询的是仅b表的name字段的模糊查询,可能会导致子查询查出的数据量减少,注意查询条件的定位,不同位置含义不同。

因为查询的主表是c表,因此from内部的子查询为数据基本盘,from内部的子查询的数据准确则整体数据准确。

需求3、在需求2基础上,增加整体聚合结果按“创建时间”排序、分页

select r.id,r.name,r.createdAt,r.bIDs as bIDs,r.bNames as bNames,r.aIDs as aIDs,group_concat(a.name SEPARATOR ',') as aNamesfrom(select c.id AS id,c.name AS name,c.created_at AS createdAt,c.b_ids as bIDs, c.a_ids as aIDs, group_concat(b.name SEPARATOR ',')  as bNamesfrom demo_cs  cleft join demo_bs  bon FIND_IN_SET(b.id, c.b_ids) > 0where c.name like '%c%'group by c.id) rleft join demo_as aon FIND_IN_SET(a.id, r.aIDs) > 0where  r.bNames like '%b%'group by r.idorder by r.createdAt desclimit 10 offset 0

查询结果

1e42b34cebff4cf28af7aa37cb555b0c.png

注意,外层的on FIND_IN_SET(a.id, r.aIDs) > 0 条件是作用在a表和查询出来的r结果之上因此aIDs即使为空字符串,也不会导致最终结果的数量减少,而是对应的aNames查出来为空而已(aIDs没有id,对应的aNames为空正常)。

如果需要第二页,则将最后面的limit 10 offset 0 换为 limit 10 offset 10即可。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯第十一届电子类单片机组程序设计

目录 前言 单片机资源数据包_2023(点击下载) 一、第十一届比赛原题 1.比赛题目 2.赛题解读 1)计数功能 2)连续按下无效按键 二、部分功能实现 1.计数功能的实现 2.连续按下无效按键的处理 3.其他处理 1)对于…

vue-draggable-resizable配合vue-plugin-hiprint实现移动输入框(或者其他东西)打印

思路 vue-plugin-hiprint打印只能打印模板(不选择打印范围,因为控制不好位置,所以采用vue-plugin-hiprint自带的打印功能),然后就通过让移动输入框有个父盒子并且输入框怎样移动都不能越过父盒子,所以让这…

SpringCloud Bus 消息总线

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅,从传统的模块之间调用,一步步的升级为 SpringCloud 模块之间的调用,此篇文章为第八篇,即介绍 Bus 消息总线。 二、概述 2.1 遗留的问题 在上一篇文章的最后,我…

网络架构层_服务器上下行宽带

网络架构层_服务器上下行宽带 解释一 云服务器ECS网络带宽的概念、计费、安全及使用限制_云服务器 ECS(ECS)-阿里云帮助中心 网络带宽是指在单位时间(一般指的是1秒钟)内能传输的数据量,带宽数值越大表示传输能力越强,即在单位…

汇总全网免费API,持续更新(新闻api、财经、音乐。。。)

Public&FreeAPI 网址:apis.whyta.cn UomgAPI 网址:https://api.uomg.com 接口大全 网址:https://www.free-api.com 阿里云api市场 网址:https://market.aliyun.com/data 总结 如果需要更稳定的api,推荐…

strncat 函数

函数理解记忆:str表示的是该函数为string.h里的函数。nnat比strcat多了一个n表示是有数量number的追加。 函数的传入值和返回值: char* strncat( char*brr,char*arr,size_t n); 分别传入被追加的字符串,追加的字符串,追加字符串…

安装mysql到免费DataGrip保姆级教程

由于本教程是全过程,齐全到每一步都有,所以更多的是图片,所以只需要根据图片每一步操作即可,篇幅有点长,见谅。 目录 1,安装mysql 2,环境配置 3,安装DataGrip 4,配置…

【linux线程(二)】线程互斥与线程同步

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:Linux从入门到精通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学更多操作系统知识   🔝🔝 Linux线程 1. 前言2. 多线程互…

[Java、Android面试]_03_java内存管理:虚拟内存、堆、垃圾回收

本人今年参加了很多面试,也有幸拿到了一些大厂的offer,整理了众多面试资料,后续还会分享众多面试资料,感兴趣的朋友可收藏关注, 现分享如下: 文章目录 1. Java虚拟机运行时数据区2. Java堆3. 垃圾回收3.1 如…

白酒:酿造环境的优化与生态平衡的维护

在豪迈白酒的酿造过程中,酿造环境的优化与生态平衡的维护对于产品的品质和可持续发展具有重要意义。云仓酒庄深知这一点,采取了一系列措施来保护和改善酿造环境。 首先,酒庄重视酿造环境的绿化和美化工作。通过种植树木、花卉等植物&#xff…

windows达梦安装

1.首先准备好windows安装系统,准备工作的做好,然后把素材包dm8_20230418_x86_win_64放进去,进行解压 解压完成之后,把dm8_20230418_x86_win_64再次进行解压,然后点击安装setup进行安装 然后点击接受进行下一步&#xf…

证书透明度|微软发布CT政策,亚数TrustAsia成为其可信任的CT运营商

近日,Microsoft(微软)发布证书透明度(Certificate Transparency,CT)政策,允许微软Web应用程序与浏览器保持一致的信任,或需要满足监管要求,可以通过CT来实现。 &#xff…