UPDATE table
SET
amount -= '$amount'
WHERE
type = '1' AND
amount - '$amount' >= '0'
好的,我们解释一下。如果我的表中有两行:
type | amount
1 | 30
1 | 20
我想从$amount
等于type
的行中减去1
的所有内容。因此,如果$amount
保持数字40,那意味着我完全想要减去40并获得此结果:
type | amount
1 | 0
1 | 10
(第1行30和第2行10,这意味着减去40)
因此,如果一行未覆盖$amount
中的数字,我想继续减去另一行。但是,如果甚至不是每一行都覆盖$amount
,则不应减去。
哪种方法管理最简单?
我使用PHPMyAdmin。
感谢您的帮助!
答案 0 :(得分:1)
如果我理解你想要做什么,那对于SQL语言来说太复杂了:或者至少太复杂而不实用。
在我看来,你有两个我能想到的选择:
1)您可以从数据库中检索id = 1的所有行,并在PHP中相应地修改它们,然后更新每个行。这将是最简单的。
2)在数据库中创建用于执行处理的用户定义函数。根据您的数据库,这将是最安全,最有效但难以实现的。
答案 1 :(得分:0)
这样的事情(假设MySQL)将是它的开始。您需要使用变量来跟踪原始数量仍然可用的数量。这需要一些改进来处理边缘情况(如果有的话),而且我已经脱离了我的头脑,所以很可能根本不起作用(我的大脑今天很难):
select @available := 40;
UPDATE yourtable
SET @newavailable := amount - @available, amount = amount - @available, @available := @newavailable
WHERE @available > 0;
答案 2 :(得分:0)
您可以使用存储过程执行此操作,它看起来像这样:
SET @totalamount = 40; (x数量为40)
IF @totalamount - (从表中选择sum(amount),其中type = 1)< 0那么 返回;
ELSE @count = 0; WHILE(@totalamount> 0)DO
SET @recordamount = SELECT amount FROM table ORDER BY somevalue limit @count,1;
SET @identifier = SELECT primarykey FROM table ORDER BY somevalue limit @count,1;
@totalamount - @recordamount;
IF(@totalamount < 0)
UPDATE table SET amount = -@totalamount WHERE primarykeycolumn = @identifier;
ELSE
UPDATE table SET amount = 0 WHERE primarykeycolumn = @identifier;
END IF;
@count = @count + 1;
结束时间; 结束如果;
您需要选择一个变量来对表进行排序,通过该变量来确定计算的执行顺序,并且您需要一个主键来标识记录。这绝对是一种可怕的方法,通过将SQL查询的结果加载到数组中,以编程方式执行此操作会更好。如果有一个非常好的理由在SQL中保留所有内容,可能需要进行一些修改?会做的。