我有一個用戶社區,用戶可以通過寫評論(+5分),上傳圖片(+10分)等特定動作獲得「用戶積分」。積分習慣於「買」像T恤衫(-100分)的東西。每一個動作都記錄到MySQL表userpoints_log
:MySQL表格 - 計算過去12個月的積分
- ID(INT,PK)
- USER_ID(INT,FK到用戶表)
- 的action_id(INT,FK行動表)
- 點(INT,點本身就像+5或-100)
- created_at(日期)
目前,我計算userpoints爲每個用戶,只需通過進行在這個表中的所有點登錄(由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年4月15日運行上面的查詢,我會得到的結果是0點(-500 + 500),這是不正確的,因爲用戶應該有500分。
500分是正確的結果,因爲當用戶使用他的積分(-500)時,他首先使用他的「最老的」積分,他不能使用未來的積分。如果我們假設,我們排除2016-04-01的+1000分,那麼已經使用了500分(2016-05-01爲-500分)。
任何想法哪些公式或查詢我可以使用,以獲得正確的值?
您是否試圖查看'GROUP BY'close? 我想你錯過了'GROUP BY user_id'或任何你想要的組合 –
你能否提供一些細節,說明爲什麼你想要的輸出在那個例子中是500,而不是0? –
@IkeWalker:更新了問題。總結:500分是正確的結果,因爲當用戶使用他的分數(-500)時,他首先使用他的「最老」分數,並且他不能使用未來的分數。如果我們假設,我們排除2016-04-01的+1000分,那麼已經使用了500分(2016-05-01爲-500分)。 – bernhardh