2017-01-23 56 views
0

我有一個用戶社區,用戶可以通過寫評論(+5分),上傳圖片(+10分)等特定動作獲得「用戶積分」。積分習慣於「買」像T恤衫(-100分)的東西。每一個動作都記錄到MySQL表userpoints_logMySQL表格 - 計算過去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分)。

任何想法哪些公式或查詢我可以使用,以獲得正確的值?

+0

您是否試圖查看'GROUP BY'close? 我想你錯過了'GROUP BY user_id'或任何你想要的組合 –

+1

你能否提供一些細節,說明爲什麼你想要的輸出在那個例子中是500,而不是0? –

+0

@IkeWalker:更新了問題。總結:500分是正確的結果,因爲當用戶使用他的分數(-500)時,他首先使用他的「最老」分數,並且他不能使用未來的分數。如果我們假設,我們排除2016-04-01的+1000分,那麼已經使用了500分(2016-05-01爲-500分)。 – bernhardh

回答

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.變化點數據第一次獲得之前