更新行直到sum匹配?

时间:2011-07-31 14:42:34

标签: php mysql math currency

我有一张类似

的表格

ID
类型:Auto inc-int
评论:唯一的身份
值已插入auto inc int

dateGained
输入:dateTime
评论:获得日期货币
插入的值:当前日期/时间

amntGained
类型:浮动
评论:获得的货币数量
插入的值:获得的值(例如0.25)

amntUsed
类型:浮动
注释:当使用部分值时,此列会更新 插入的值:0

UUID
输入:uuid
评论:用户uuid
插入的值:(一个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和一个数量的函数,然后函数必须经过从最早的开始并更新使用的值,直到满足给定的数量。

e.g。如果函数是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 

但我对于如何有效地完成这项工作或根本没有完全的想法。

1 个答案:

答案 0 :(得分: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