这是我数据库结构的精简版本

affiliates
    -id

users
    -id
    -affiliate_id

user_transactions
    -id
    -user_id
    -amount - integer
    -type - string(deposit, withdraw)
    -deposit_time - timestamp

对于昨天发生的按类型(affiliatesdeposit等)汇总的事务,获得withdraw的最有效方法是什么?
所以本质上我需要SQL返回的是
affiliates.id, deposit_amount, withdraw_amount
我现在使用的是一个ORM,它基本上执行两个查询,一个是子公司的查询,然后执行以下内容:
select id
(select sum(amount) from user_transactions as ut where ut.deposit_time = DATE(?) and ut.user_id = users.id and ut.type = deposit) as deposit_amount,
(select sum(amount) from user_transactions as ut where ut.deposit_time = DATE(?) and ut.user_id = users.id and ut.type = withdraw) as withdraw_amount
from users where affiliate_id in ?

这是一个近似的查询。前2?是昨天的日期,第三个是前一个查询的用户id数组。
在MySQL中,实现这一点最有效的方法是什么?

最佳答案

您不需要affiliates表。一个简单的JOINGROUP BY和一些条件聚合就足够了:

select u.affiliate_id,
       sum(case when type = 'deposit' then ut.amount else 0 end) as deposit,
       sum(case when type = 'withdraw' then ut.amount else 0 end) as withdraw
from users u join
     user_transactions ut
     on ut.user_id = u.id
group by u.affiliate_id;

关于mysql - 如何从相距2度的表中对交易金额求和,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50283610/

10-16 13:11