Php 更新行,直到总和匹配为止?
我有一张看起来像的桌子 idPhp 更新行,直到总和匹配为止?,php,mysql,math,currency,Php,Mysql,Math,Currency,我有一张看起来像的桌子 id 类型:汽车公司内部 注释:唯一id 插入值自动有限公司 日期获得 类型:日期时间 备注:获得货币的日期 插入值:当前日期/时间 AMNTG 类型:浮动 注释:获得的货币金额 插入值:获得的值(例如0.25) amntUsed 类型:浮动 注释:使用部分值时,此列将更新 插入值:0 uuid 类型:uuid 备注:用户uuid 插入的值:(一个uuid) 因此,一些示例行(对于单个用户)将是 现在我的问题是关于逻辑: 基本上,我有一个给定uuid和数量的函数,然后该函
类型:汽车公司内部
注释:唯一id
插入值自动有限公司 日期获得
类型:日期时间
备注:获得货币的日期
插入值:当前日期/时间 AMNTG
类型:浮动
注释:获得的货币金额
插入值:获得的值(例如0.25) amntUsed
类型:浮动
注释:使用部分值时,此列将更新
插入值:0 uuid
类型:uuid
备注:用户uuid
插入的值:(一个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
但对于如何有效地完成这项工作,我完全一无所知。这对你有用吗?(更新版版本)
对我来说,这类似于一个事务/日志表,如果我面临同样的问题,我可能会重新建模,并拥有另一个包含整体“余额”或类似解决方案的表。当然没有太多帮助。我们实际上也有一个交易日志,但货币在获得后6个月到期,因此我们还需要保存这样的日志。。而且,由于用户不必一次使用整块货币,这就变得更加困难。。
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
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