2017-09-24 68 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萬用戶。 –

相關問題