2017-09-24 64 views
0

我有三个表;一个存储用户,一个存储每个用户的费用和每个用户的第三个表格返回。每个都由用户连接。但是有很多用户不使用该服务,所以我很想避免不会扫描整个用户表的解决方案。返回两个不同表中相同成员的SUM值

我正在使用MySQL btw。

users: id, name 
expenses: id,userid,amount,date 
returns:id,userid,amount 

的样本数据是:

users: 
1    Sosuna 
2    Mike 

expenses: 

1 1 100 2017-01-01 
2 1 20 2017-01-13 
3 2 50 2017-02-13 

returns: 

1 1 20 
2 1 10 
3 1 30 
4 1 10 

现在预期的输出仅仅是其中的一个组合。用户不能存在于回报中,而不存在开支,寿。

user_id  name  total_expenses  total_returns 
    1   Sosuna  120     70 
    2   Mike   50      0 

我试过了几个查询,但都没有工作。这个UNION ALL查询有效,但输出结果不是我们想要的。我希望有兴田输出,而无需使用任何前端的东西:

SELECT SUM(amount) as total_given,userid,'expense' as source FROM `expenses` GROUP BY userid,source 
    UNION ALL 
    SELECT SUM(amount) as total_returned,userid,'returnedback' as source FROM returns GROUP BY userid,source ORDER BY userid,source 

回答

2

如何:

select id, max(name) as name, sum(expenses) as expenses, sum(returns) as returns 
from ((select id, name, 0 as expenses, 0 as returns 
     from users 
    ) union all 
     (select userid, null, amount, 0 
     from expenses 
    ) union all 
     (select userid, null, 0, amount 
     from returns 
    ) 
    ) uer 
group by id; 

编辑:

另一种方法是:

select u.*, 
     (select sum(e.amount) from expenses e where e.userid = u.id 
     ) as expenses, 
     (select sum(r.amount) from returns r where r.userid = u.id 
     ) as returns 
from users; 

如果您在expenses(userid, amount)returns(userid, amount)上有索引,这将会更快。

+0

它确实有效,但它看起来比我想要的要慢。我有近30万用户。 –

相关问题