记录一次巧妙的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 '商品表筛选条件' )
相关推荐
pixcarp7 小时前
知识库系统的内容资产闭环怎么设计
服务器·数据库·后端·golang
JosieBook7 小时前
【数据库】时序预测能力的分级进化:TimechoAI如何让每一类用户都能精准预见未来
java·开发语言·数据库
吴声子夜歌9 小时前
SQL经典实例——使用多张表
数据库·sql
倔强的石头_10 小时前
《Kingbase护城河》——深度解密数据库行锁冲突与等待事件架构
数据库
IT策士10 小时前
Redis 从入门到精通:性能调优与多语言客户端对比
数据库·redis·缓存
Bert.Cai11 小时前
Oracle INSTR函数详解
数据库·oracle
茉莉玫瑰花茶13 小时前
综合案例 - AI 智能租房助手 [ 5 ]
服务器·数据库·人工智能·python·ai
ywl47081208713 小时前
jwt生产token,简单版helloworld
java·数据库·spring
器灵科技13 小时前
AI视频工具实测:Seedance/可灵/HappyHorse谁最能打?
java·运维·数据库·人工智能·github
摇滚侠13 小时前
MyBatis 入门到项目实战 特殊 SQL 的执行 34-37
java·sql·mybatis