记录一次巧妙的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 '商品表筛选条件' )
相关推荐
不可求~1 小时前
多模型路由怎么落地:把任务分流写进项目的最小实现
java·前端·数据库
Lumistory2 小时前
城市建筑照明的落地与长效运营观察
大数据·数据库·中间件·光照贴图
围炉聊科技4 小时前
长期免费的数据库方案——零成本基建系列
数据库
AC赳赳老秦4 小时前
公开图片 OCR 数据提取:OpenClaw 合规采集公开信息图,识别文字与表格并转化为结构化数据
java·大数据·前端·数据库·python·php·openclaw
bransyin5 小时前
一个 SQL 字段到底是怎么算出来的?我做了一个能给出“证据”的血缘工具
大数据·sql·ai·血缘
梁辰兴6 小时前
软件工程:数据结构设计
数据库·软件工程·设计原则·设计方法·梁辰兴·数据库结构设计·数据库结构类型
AC赳赳老秦6 小时前
风控岗应用:OpenClaw 采集公开司法与经营异常数据,自动生成企业风险评估报告
大数据·c语言·数据库·人工智能·python·php·openclaw
灯澜忆梦7 小时前
【MySQL18】进阶篇 | MySQL管理
数据库·mysql
zcmodeltech8 小时前
智能制造教学实训沙盘模型多系统协同控制系统设计:基于STM32与Modbus RTU的工业机器人-智慧工厂-数字孪生全场景联动方案
数据库·stm32·嵌入式硬件·机器人·制造·多分类
AI多Agent协作实战派8 小时前
AI多Agent协作系统实战(四十):AI说“没有错误“,系统判了“测试失败“——一个正则的误判
数据库·人工智能