2011-07-31 41 views
0

我有一個表,看起來像更新行直到總和匹配?

ID
類型:自動INC-INT
點評:獨特的ID
插入的值自動INC INT

dateGained
類型:日期時間
評論:獲得日期貨幣
插入的值:當前日期/時間

amntGained
類型:浮動
評論:貨幣金額獲得
插入的值:獲得的值(例如0.25)

amntUsed
類型:浮動
評論:當使用值的一部分此列得到更新
插入的值:0

UUID
類型:UUID
評論:用戶uuid
插入的值:(a uuid)

所以幾個示例行(用於單個用戶)將是

1 | 2010-07-30 00:00:00 | 0.25 | 0.20 | [uuid] 
2 | 2010-08-12 00:00:00 | 1.75 | 0.00 | [uuid] 
3 | 2010-08-17 00:00:00 | 8.25 | 0.00 | [uuid] 
4 | 2010-09-15 00:00:00 | 0.05 | 0.00 | [uuid] 

現在的問題是圍繞着邏輯:

基本上我有是給予一個UUID和的量,則該函數則功能必須從最早的開始經歷並更新使用的值,直到滿足給定的量。

例如如果函數給出6.25[uuid]

表看起來像

1 | 2010-07-30 00:00:00 | 0.25 | 0.25 | [uuid] //still need to use 6.20 
2 | 2010-08-12 00:00:00 | 1.75 | 1.75 | [uuid] //still need to use 4.45 
3 | 2010-08-17 00:00:00 | 8.25 | 4.45 | [uuid] //we now have 3.80 remaining 
4 | 2010-09-15 00:00:00 | 0.05 | 0.00 | [uuid] //this row is untouched 

,但我有一個完整的頭腦就如何有效地或全部爲此事做這個空白。

+0

這類似於事務/日誌表給我,如果我面臨同樣的問題,我可能會改造,並有包含整體的另一個表「平衡」或類似的解決方案。當然沒有太多的幫助。 –

+0

我們實際上也有一個交易日誌,但是貨幣在獲得後6個月到期,因此我們還需要保存這樣的日誌..並且因爲用戶不必一次使用整塊貨幣變得更加困難.. – Hailwood

回答

1

它適合你嗎? (更新版)

UPDATE table1 t3 
INNER JOIN 
(
SELECT t1.id, IFNULL(SUM(t2.amntGained),0) as total // 0 for the smallest date 
FROM table1 t1 
LEFT JOIN table1 t2 ON (t2.uuid = t1.uuid AND t2.dateGained < t1.dateGained) 
// LEFT JOIN,not INNER because "<" is used for joining, 
WHERE uuid = 1 
GROUP BY t1.id 
)X ON (X.id=t3.id) 
SET t3.amntUsed = IF(X.total+t3.amntGained <=6.25, t3.amntGained, 
IF(6.25-X.total>0, 6.25-X.total,0)) 
WHERE t3.uuid=1 

爲您的數據:

id - total - amntGained - X.total+t3.amntGained - 6.25-X.total>0 - new.amntUsed 
1 - 0  - 0.25  - 0.25     - true    0.25 
2 - 0.25 - 1.75  - 2      - true    1.75 
3 - 2  - 8.25  - 10.25     - true    6.25-2 = 4.25 
4 - 10.25 - 0.05  - 10.30     - false   0