mysql 多表统计 该如何 求和某个重复字段?

user表 uid uname
orderA 表 uid pay_type amount
orderB 表 uid pay_type amount
现在要统计 每个用户的 A类订单 和B类订单的 总金额 (条件是 pay_type=1)
现在 写的 sql 如下

select user.uid,sum(case when orderA.pay_type=1 then orderA.amount else 0) A订单总支付金额 
left join orderA on orderA.uid = user.uid

这种情况结果是正确的
但是如果在后面再进行关联第二个表 则会出现统计异常
如下

select user.uid,sum(case when orderA.pay_type=1 then orderA.amount else 0) A订单总支付金额 
left join orderA on orderA.uid = user.uid
left join orderB on orderB.uid = user.uid

但是因为还要关联查询oderB 的字段 所以第二个关联是必要的
请问这种情况该如何解决呢

阅读 2.7k
3 个回答
select uid,sum(total) as total from (
select uid,sum(case when orderA.pay_type=1 then orderA.amount else 0) as total from orderA
union all
select uid,sum(case when pay_type=1 then orderA.amount else 0) as total from orderB) as tem_table

思路大概是这样,通过union all 查询出来,再用uid去查询用户表,就可以查询到用户信息

按用户统计总金额,那必须要使用group by来按用户分组,再通过sum来统计,sql如下

select  u.uid, 
        ifnull(sum(orderA.amount), 0) sumA, 
        ifnull(sum(orderB.amount), 0) sumB
from my_user u
left join my_orderA orderA on orderA.uid = u.uid and orderA.pay_type = 1
left join my_orderB orderB on orderB.uid = u.uid and orderB.pay_type = 1
group by u.uid

一般不建议把压力给到数据库。
方案一:分开查,由代码逻辑层进行数据合并处理。
方案二:
确实是有统计需求的,表就不应该这么设计。否则数据量一起来,这种联合查询统计对服务器压力不是一般的大。再加一个统计表,字段:用户id、A类订单总额、B类订单总额、合计总额。在用户下单支付成功后累加,将统计压力分摊到每个用户的支付处理里面,需要查询时直接单表查即可。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题