我有一个用户社区,用户可以获得“用户点”以执行特定操作,例如撰写评论(+5分),上传图片(+10分)等。积分可用于“购买”类似的东西一件T恤(-100分)。每个操作都记录到MySQL表userpoints_log
:
目前,我计算每个用户的用户点,只需在此表中生成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)。
我可以使用哪些公式或查询来获取正确的值?
答案 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.更改 - 首次获得之前的点数据