我有下表:
交易: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/