mysql - 用不同的表做一些相当基本的求和

标签 mysql sql

我有下表:

交易:Transaction_ID Datetime Giver_ID Recipient_ID Points Category_ID Reason

奖励:Reward_ID Title Description Image_URL Date_Inactive Stock_Count Cost_to_User Cost_to_System

购买:Purchase_ID Datetime Reward_ID Quantity Student_ID Student_Name Date_DealtWith Date_Collected

<小时/>

工作人员向学生奖励积分,这些积分将成为交易表的条目,如下所示:

<强> Transaction_ID Datetime Giver_ID Recipient_ID Points Category_ID Reason
8 2011-09-07 36761 127963 2 1 Excellent behaviour in behaviour unit

然后,学生可以购买奖励,该奖励将成为购买表的一个条目,如下所示:

<强> Purchase_ID Datetime Reward_ID Quantity Student_ID Student_Name Date_DealtWith Date_Collected
1570 2012-05-30 12:46:36 2 1 137616 Bradley Richardson NULL NULL

所有奖励均手动存储在奖励数据库表中:

<强> Reward_ID Title Description Image_URL Date_Inactive Stock_Count Cost_to_User Cost_to_System
1 Lunch Time Queue Pass (month) Beat the queue and get to the hot food early! /user/74/167976.png 2012-04-16 11:50:00 0 100 0

<小时/>

我的问题是这样的:
给定 Reward_ID 和 Student_ID,我可以使用什么 SQL 语句来计算学生是否有足够的积分来购买奖励?

我之前曾在 PHP 中完成过此操作,但如果可能的话,我希望能够使用单个 SQL 语句来完成此操作。伪代码类似于 SELECT ( SumOfPointsEarned - SumOfPointsOfPurchasesMade )但我完全不知道该怎么做!

如有任何建议,我们将不胜感激。

最佳答案

一种方法是使用内联 View 。为此,

  • 创建一个查询来汇总所获得的积分
  • 创建一个查询,对所花费的积分进行求和
  • 将这些查询连接在一起(左连接,以防它们尚未花费任何内容)
  • 做减法


SELECT SumOfPointsEarned.Points - COALESCE(SumOfPointsOfPurchasesMade.Points, 0) AS CurrentPoints
FROM   
(
    SELECT SUM(Points) AS Points, Recipient_ID 
    FROM   transactions 
            WHERE Recipient_ID= 137642
    GROUP  BY Recipient_ID
) AS SumOfPointsEarned 
    LEFT JOIN 
    (
        SELECT purchases.Student_ID,  SUM(rewards.Cost_to_User) AS Points 
        FROM   purchases 
            INNER JOIN rewards 
            ON purchases.Reward_ID = rewards.Reward_ID 
                    WHERE Student_ID = 137642
        GROUP  BY purchases.Student_ID
    ) AS SumOfPointsOfPurchasesMade 
    ON SumOfPointsEarned.Recipient_ID = SumOfPointsOfPurchasesMade.Student_ID

关于mysql - 用不同的表做一些相当基本的求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10836001/

相关文章:

mysql - 内连接mysql连接3个表

mysql - 连续几天的特定状态

sql - 使用 postgresql 分区中的最后一个值填充列

MYSQL 选择用户名并对他们的评论进行求和

php - 以下 MySql 存储过程是否容易受到 SQL 注入(inject)攻击?

php - 无法按照最新的聊天顺序对成员进行排序

php - 使用 SSH 导入 SQL

mysql - 加入具有相同 ID PDO 的 2 个表

sql - 我是否使用 crosstab() 或 case when 函数来实现所需的结果 [postgresql]

sql - db.Exec()未在golang中为SQL Server返回正确的RowsAffected()值