2017-09-24 24 views
0

私は3つのテーブルを持っています。 1つはユーザーを格納し、1つは各ユーザーに経費を格納し、3つ目のテーブルは各ユーザーの戻り値を格納します。それぞれはユーザーによって接続されています。しかし、サービスを使用しないユーザーが多いので、ユーザーの全員の表をスキャンしないようなソリューションは避けてください。2つの異なるテーブルから同じメンバーの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; 

EDIT:

別の方法は、次のようになります。

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

それは動作しますが、私が望むよりも遅く表示されます。私は約300kのユーザーを持っています。 –

関連する問題