记录一次巧妙的SQL:一对多关联导致的 sum () 、count()等group函数重复计算问题

1.问题:

两张数据库表关系为一对多,为实现业务逻辑将主表和子表进行了关联,然后使用sum()函数计算主表数据时,发现数据会因为连表重复计算。

1.1具体案例:

订单表和订单商品表是一对多的关系,此时有一个需求是根据商品名称筛选订单。

于是很自然的将订单表和订单商品表做了连表,然后将订单商品表中的商品名称作为筛选字段。

但是查询时还需要根据筛选条件sum()计算订单的总金额,订单金额是主表的数据,此时主表的数据因为连表会重复多次,所以sum()计算了多次订单金额。

2.解决方案

2.1 代码逻辑实现

第一反应是将符合条件的订单id查出来然后再用一条sql去计算金额,但是总感觉两条SQL有点笨,还是尽量想一条SQL实现。

2.2 SQL实现

主要逻辑就是在子查询中给订单id去重后作为筛选条件

复制代码
select  sum(o.order_price) as totalOrderPrice,sum(o.actual_price) as totalActualPrice
from `order` o
left join `user` u
on o.user_id = u.id
where o.id in (
select DISTINCT order_id from `order_goods` where '商品表筛选条件' )
相关推荐
禾小西2 分钟前
05丨Redis 内存快照:宕机后,如何实现快速恢复?
数据库·redis·缓存
笃行3502 分钟前
数据同步软件:KFS 在 KingbaseES 项目里到底解决了什么
数据库
AOI小白新手上路23 分钟前
视频去雨·论文蒸馏笔记:从物理先验到状态空间模型
数据库·笔记·音视频
小码哥06831 分钟前
搭建短剧系统|海外短剧:从需求到上线的指南
网络·数据库·音视频·短剧小程序·短剧系统·短剧开发·短剧后台
HSunR39 分钟前
ruoyi 若依 自定义注解 参数校验
java·前端·数据库
禾小西1 小时前
06丨Redis 数据同步:主从库如何实现数据一致?
数据库·redis·php
前端 贾公子1 小时前
LangGraph == 图的状态(State)管理 (上)
java·开发语言·数据库
薛晓刚2 小时前
PGA 超限的一次应急处置:扩容、清游标、杀会话
数据库
CJi0NG2 小时前
【自用】MySQL-事务
数据库·mysql
我不会插花弄玉2 小时前
4.string类型【由浅入深-redis】
数据库·redis·缓存