联表查询求和的一些问题
假如现在有两张表,表A:
表B:
tableA和tableB通过index关联
现在的需求是已知tableA的batchNo,需要求该batchNo对应的sum(column1)和sum(column3),我们先尝试下left join
明显可以看出,join后的结果有三条,依照这种结果来求column1的和会出错。由于batchNo和index是一对多的关系,而在B表中index相同的记录可能会有多条,联表查询的条数等于两张表中对应记录较多的表的记录条数,而需求是一次将两张表中对应指定字段的和求出,除非刚好两张表中记录条数一致否则就会有某一张表中的字段和出错。
那最后解决办法是什么呢?贴一个简单示例
SELECT batchNo, SUM(column1Sum) column1Sum, SUM(column2Sum) column2Sum
FROM
(
SELECT batchNo, SUM(column1) column1Sum, 0 column2Sum FROM tableA
WHERE batchNo = 'x' GROUP BY batchNoUNIONSELECT '' batchNo, 0 column1Sum, SUM(column3) column2Sum FROM tableB b
WHERE b.`index` IN
(
SELECT `index` FROM tableA a WHERE a.batchNo = 'x'
)
GROUP BY `index`
) aa GROUP BY batchNo
是不是有模有样了,最后按照batchNo求和即可,但是表B里没有batchNo啊,没关系,再套一层
SELECT batchNo, SUM(column1Sum) column1Sum, SUM(column2Sum) column2Sum
FROM
(SELECT batchNo, SUM(column1) column1Sum, 0 column2Sum FROM tableA
WHERE batchNo = 'x' GROUP BY batchNoUNIONSELECT a.batchNo batchNo, 0 column1Sum, SUM(column2Sum) column2Sum FROM
(
SELECT `index`, SUM(column3) column2Sum FROM tableB b GROUP BY `index`
)c LEFT JOIN tableA as a ON c.`index` = a.`index`
WHERE a.batchNo = 'x' GROUP BY a.batchNo) aa GROUP BY batchNo
完美解决!可以根据需要改成批量查询,虽然这个SQL看起来复杂,真正的查询部分只是最内层有,外层只是对数据进行处理,所以速度不会很慢。
简单介绍一下思路:
分别对两张表中对应的字段求和,对不需要的字段设为0并且重命名,相当于构建一张子表,然后使用union将两张子表合并,最后再求一次和得出最终结果。需要注意union的连接的表字段要一致。
好处是能满足需求,坏处是很看起来确实不是很好理解哈哈哈,说不定写完过一个星期自己都看不懂了。我的需求要联五张表,写出来一大坨,但其实每个子查询都是相对独立的,排查的时候由内往外,耐心一点。如果没有要求,其实可以分开查询每个和。
如果有大佬有更好的解决方式,欢迎指点一二。
联表查询求和的一些问题相关推荐
- 《MySQL》入门基础知识点大全:数据库操作、增删改查、联表查询、常用函数、MD5加密、事务特性、隔离级别
MySQL基础知识大全 1.操作数据库 1.1 创建表 1.2 修改表名 1.3 增加表的字段 1.4 修改表的字段 1.4.1 修改表的字段 1.4.2 修改表名 1.5 删除表的字段 1.6 删除 ...
- MongoDB联表查询aggregate : $lookup
参考:MongoDB联表查询 建表插入数据: db.createCollection("user") db.user.insertMany([{_id: ObjectId(&quo ...
- MysqlSQL语句2☞联表查询、自连接、分页和排序、子查询、常用函数、聚合函数、MD5加密
联表查询 where等值查询 on 连接查询 1.内连接 SELECT `grade`,s.id,`name` FROM student [AS] s INNER JOIN result [AS] r ...
- SQL--高级查询--联表查询
--统计函数: --count总数.max最大.min最小.avg平均.sum求和 select * from Student --求出 学生表中的数据总条数 --count:求数据总条数 selec ...
- Spring Hibernate JPA 联表查询 复杂查询
(转自:http://www.cnblogs.com/jiangxiaoyaoblog/p/5635152.html) 今天刷网,才发现: 1)如果想用hibernate注解,是不是一定会用到jpa的 ...
- (转)MySQL联表查询
资料源于网络 一.内联结.外联结.左联结.右联结的含义及区别 在SQL标准中规划的(Join)联结大致分为下面四种: 1.内联结:将两个表中存在联结关系的字段符合联结关系的那些记录形成记录集的联结. ...
- MYSQL 联表查询 ORDER 效率低?
今天在处理一个分页时候,发现速度感人,点下一页等了半天.然后查看代码,发现是一个left jion语句. SELECT DISTINCT ordr.id,ordr.*,cf.nickname FROM ...
- 【explain】MySQL联表查询中的驱动表
写在前面 1.不要求每个人一定理解 联表查询(join/left join/inner join等)时的mysql运算过程 2.不要求每个人一定知道线上(现在或未来)哪张表数据量大,哪张表数据量小 3 ...
- mysql带账号联查表_MySQL联表查询的简单示例
MySql会用到联表查询,对于刚学习的新手来说,可能会理解起来有难度.下面这篇文章就来给大家详细介绍MySQL联表查询的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 关系型 ...
最新文章
- 常见机器学习算法背后的数学
- iOS 自定义 View
- Oracle自定义函数
- delete file$ recovery----惜分飞
- centos radius mysql_centos6.5下安装freeradius2.2.9+mysql
- 服务器需要哪些芯片,云计算的服务器需要芯片
- spring REST中的内容协商(同一资源,多种展现:xml,json,html)
- Ajax专题:异步交互局部刷新初步
- HTML5 大文件断点续传完整思路整理
- 代挂管家易开源7.4+web版
- 基于Lasso回归筛选变量构建Cox模型并绘制Nomogram
- java木马_Java校验上传图片文件是否含有木马的两种方式
- iOS : 通过路径读取文件的几种方法
- ESP8266/ESP32/nodeMcu/wemos D1 MINI开发板用TFT_eSPI库驱动ST7789(240*240)TFT显示屏
- java爬虫抓取nba_利用Python爬虫爬取NBA数据功能实例分享
- 超神学院之天河战役计算机,《超神学院之雄兵连 第1季 天河战役篇》
- Newtonsoft.Json 使用
- 字符串?=字符+\0
- 马云天价请不动的中国顶级黑客
- 黑苹果cpu支持列表_单卡gpu直通,黑苹果,amd_cpu教程