记录一次巧妙的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 '商品表筛选条件' )
相关推荐
心随雨下5 小时前
Redis中Geospatial 实际应用指南
数据库·redis·分布式·缓存
黑夜管理员5 小时前
Sql Server安装报错“服务没有及时响应启动或控制请求”
数据库·sql server
NineData5 小时前
NineData云原生智能数据管理平台新功能发布|2025年9月版
数据库·云原生·devops·ninedata·数据库迁移·数据复制·风险sql管控
junnhwan6 小时前
【苍穹外卖笔记】Day04--套餐管理模块
java·数据库·spring boot·后端·苍穹外卖·crud
一枚正在学习的小白6 小时前
PG数据文件位置迁移
linux·运维·服务器·数据库
真的想不出名儿6 小时前
上传头像到腾讯云对象存储-前端基于antdv
java·数据库·腾讯云
Dreams_l6 小时前
初识redis(分布式系统, redis的特性, 基本命令)
数据库·redis·缓存
数据库知识分享者小北6 小时前
Qoder + ADB Supabase :5分钟GET超火AI手办生图APP
数据库·后端
点亮一颗LED(从入门到放弃)7 小时前
SQLite3数据库——Linux应用
linux·数据库·sqlite