繁体   English   中英

从 SQL (MySQL) 中的两个不同表中减去计算值

[英]Subtracting calculated values from two different tables in SQL (MySQL)

在我的程序中,用户可以通过在该场所进行签到来获得该场所的积分。

然后,他们可以使用这些积分在该场所兑换奖励。 积分不可跨场地共享。

我有以下表格:

用户

  • ID
  • 姓名

场地

  • ID
  • 姓名

签到

  • ID
  • user_id (FK):获得积分的用户
  • venue_id (FK):用户在其中获得积分的场所
  • 积分:获得的积分数量

奖励

  • ID
  • 姓名
  • venue_id:奖励所属的场地
  • 点数:奖励成本的数量

奖励_赎回

  • ID
  • 用户身份
  • 奖励ID

我可以按场地计算用户的总积分,如下所示:

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

所以我的问题是:

  1. 是否可以在一次查询中获得总积分和兑换积分?
  2. 是否可以在一次查询中获得总积分、兑换积分和剩余积分?

您可以使用union allgroup 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM