2011-07-31 42 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