2016-08-19 42 views
2

我現在正在用貨幣到期追蹤問題(原來它不是金錢,但我用它作爲一個更方便的例子)。貨幣到期跟蹤

用戶可以通過某個神祕的原因從平臺上賺錢,並花費他們購買東西(產品,禮品等)。

我正在查找算法(SQL查詢最好的情況)來查找用戶餘額的當前餘額。

支出和賺錢的事件存儲不同的數據庫(MySQL的)表(假設user_earneduser_spent)。因此,在正常情況下,我只需計算用戶總數user_earned並減去所花費的金額(總計user_spent)。

但是!有一個條件,即贏得的用戶資金在2年內到期如果他們不使用。 這意味着,如果用戶沒有使用他的資金或僅使用其中的一部分,他們將會過期。如果用戶使用他的錢,他們從使用最早的未過期的貨幣記錄,所以餘額(獎金)可以計算在用戶的青睞。

這是5分的情況在時間的事件,有對此案進行更好的理解:

Money expiration logic

兩個表(user_earneduser_spent)已時間戳日期跟蹤。

+0

這可能是一個最好在應用程序代碼中完成的任務。 –

+0

目前,我已經實施了一項服務,通過簡單地建立事件列表(接收,使用,到期)並逐個運行它們來計算餘額。它的工作原理,但如果我需要在SQL查詢中取得平衡以獲得積極的平衡,我必須在數據庫之前將該值非規格化。 – Aistis

回答

1

我在我的一個項目中做了類似的事情。

看起來像你需要一個額外的表spends_covering與列 spend_idearhed_idsum

所以每個spends記錄你需要插入一個或多個行到spends_covering,以紀念「拿來主義」的錢。

然後餘額將只是日期少於2年時未使用的總和。

select sum(sub.earned_sum-sub.spent_sum) as balance 
from 
    (select e.sum as earned_sum, sum(sc.sum) as spent_sum 
    from earned e 
     left join spends_covering sc on e.earhed_id=sc.earhed_id 
    where e.date BETWEEN ... 
    group by e.earhed_id 
    having earned_sum > spent_sum) sub 
0

它可能是值得的有兩個表 - 一個(或多個)與所有的歷史細節,只有當前餘額爲每個'用戶'。一定要使用交易來保持兩者同步。