MySQL表 - 计算过去12个月的积分

时间:2017-01-23 17:11:39

标签: mysql

我有一个用户社区,用户可以获得“用户点”以执行特定操作,例如撰写评论(+5分),上传图片(+10分)等。积分可用于“购买”类似的东西一件T恤(-100分)。每个操作都记录到MySQL表userpoints_log

  • id(int,PK)
  • user_id(int,FK to user table)
  • action_id(int,FK to action table)
  • points(int,点本身就像+5或-100)
  • created_at(date)

目前,我计算每个用户的用户点,只需在此表中生成SUM()个所有点日志(由user_id标识):

SELECT SUM(points) AS 'result' FROM userpoints_log 
WHERE user_id = X
GROUP BY user_id

现在我需要更改此计算,因为所有(正)点应仅在12个月内有效。首先,我想,我只是做以下事情:

SELECT SUM(points) AS 'result' FROM userpoints_log 
WHERE user_id = X AND created_at > DATE(NOW()-INTERVAL 1 YEAR)
GROUP BY user_id

但这给了我一些错误的结果。例如,对于以下数据集:

created_at |points
------------------
2016-04-01   | +1000
2016-05-01   |  -500
2016-06-01   |  +500

如果我在2017-04-15上运行上面的查询,我会得到0分(-500 + 500),这是不正确的,因为用户应该有500分。

500分是正确的结果,因为当用户使用他的积分(-500)时,他首先使用他的“最老”积分并且他不能使用未来积分。如果我们假设,我们从2016-04-01中排除了+1000点,那么其中500点已被使用(2016-05-01为-500)。

我可以使用哪些公式或查询来获取正确的值?

1 个答案:

答案 0 :(得分:0)

SELECT SUM(case when points < 0 and create_at < (
  select min(create_at) from userpoints_log where user_id = X
  and created_at > DATE(NOW()-INTERVAL 1 YEAR) and points > 0
) then 0 else points) AS 'result' 
FROM userpoints_log 
WHERE user_id = X AND created_at > DATE(NOW()-INTERVAL 1 YEAR)

这是psedo代码但您可以使用该逻辑 1.找到第一个+点日期
2.更改 - 首次获得之前的点数据