使用不同的值SQL更新多个行

时间:2011-07-18 18:39:46

标签: php mysql

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。

感谢您的帮助!

3 个答案:

答案 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中保留所有内容,可能需要进行一些修改?会做的。