[英]Subtracting calculated values from two different tables in SQL (MySQL)
在我的程序中,用户可以通过在该场所进行签到来获得该场所的积分。
然后,他们可以使用这些积分在该场所兑换奖励。 积分不可跨场地共享。
我有以下表格:
用户
场地
签到
奖励
奖励_赎回
我可以按场地计算用户的总积分,如下所示:
select venue_id, sum(points) as total_points
from check_ins
WHERE user_id = 109
group by venue_id, user_id;
我可以像这样计算按场地兑换的积分数:
select venue_id, sum(points) as points_redeemed
from reward_redemptions
JOIN rewards on reward_redemptions.reward_id = rewards.id
GROUP BY venue_id;
然后我可以使用编程语言(例如 PHP)通过减去它们来计算每个场地的剩余点数。
但是,我想使用 SQL 来执行此操作(理想情况下在 1 个查询中,以减少在查询之间更改数据的机会,使代码更简单,并可能提高性能)。 理想情况下,最终结果是这样的:
venue_id total_points points_redeemed points_remaining
#5 10 2 8
#15 25 10 15
#189 150 20 130
所以我的问题是:
您可以使用union all
和group by
。 以下是关于场地和积分的查询:
select venue_id, sum(total_points) as total_points,
sum(points_redeemed) as points_redeemed
from ((select venue_id, sum(points) as total_points, 0 as points_redeemed
from check_ins
group by venue_id
)
union all
(select venue_id, 0 as total_points, sum(points) as points_redeemed
from reward_redemptions rr join
rewards r
on rr.reward_id = r.id
group by venue_id
)
) p
group by venue_id;
通过减去总和可以很容易地计算出差异。
您可以连接两个表以合并它们。
SELECT c.venue_id, c.user_id
SUM(c.points) AS total_points,
IFNULL(r.points_redeemed, 0) AS points_redeemed,
SUM(c.points) - IFNULL(r.points_redeemed, 0) AS points_remaining
FROM check_ins AS c
LEFT JOIN (
select venue_id, user_id, sum(points) as points_redeemed
from reward_redemptions
JOIN rewards on reward_redemptions.reward_id = rewards.id
GROUP BY venue_id, user_id) AS r
ON c.venue_id = r.venue_id AND c.user_id = r.user_id
GROUP BY c.venue_id, c.user_id
左加入对于包括尚未兑换任何东西的用户是必要的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.