我有三张桌子;一个存储用户,一个存储每个用户的费用,第三个表返回每个用户。每个都由用户连接。但是有很多用户不使用该服务,因此我希望避免使用无法扫描整个用户表的解决方案。
我正在使用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
答案 0 :(得分: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)
上有索引,这会更快。