好吧,所以我的表有一个介于0到100之间的计数字段。这些字段中最多有六个绑定到一个id。我需要运行一个更新,将每个行减少1到3之间的不同随机数。
我知道我可以通过以下方式获得随机值:
CAST(RAND() * 3 AS UNSIGNED)
我知道我可以使用我的更新:
UPDATE Info SET Info.count = CASE WHEN Info.count < 2 THEN 0 ELSE Info.count - 2 END WHERE Info.id = $iid AND Info.type = 'Active';
(这只是确保我永远不会低于0)
但我无法将它们合并,因为显而易见的原因是我的随机数在评估时会有所不同,然后才会设置...
UPDATE Info SET Info.count = CASE WHEN Info.count < CAST(RAND() * 3 AS UNSIGNED) THEN 0 ELSE Info.count - CAST(RAND() * 3 AS UNSIGNED) END WHERE Info.id = $iid AND Info.type = 'Active';
现在我不想只保存1个变量,因为我可能需要最多6个不同的数字......有没有办法在单个查询中做我想做的事情?我知道如何在多个方面做到这一点,但每次我需要更新其中一个块时,我真的不应该运行多达6个查询......
我正在处理的表结构是:
CREATE TABLE `Info` (
`id` int(40) DEFAULT NULL,
`count` int(11) DEFAULT NULL,
`type` varchar(40) DEFAULT NULL,
`AUTOINC` int(11) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`AUTOINC`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
此时的AUTOINC字段正好可以让我轻松验证测试过程中发生了什么。
谢谢!
答案 0 :(得分:0)
你最好写一个程序来做这件事。所以你可以写一些(伪代码)
的程度create procedure update()
begin
declare id, count, sub int;
declare c cursor for select id, count floor(1+rand()*3) from info
where type='Active';
open c;
loop
fetch c into id, count, sub;
update info set case count - sub < 0 then 0 else count - sub end
where id = id;
end loop;
close c;
end
//
或者您可以将程序更改为接受我之前使用的ID,只需使用一个select和一个更新语句。