Sequel Pro带有大小写和随机变量的多重更新查询

时间:2011-10-21 00:02:45

标签: mysql variables

好吧,所以我的表有一个介于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字段正好可以让我轻松验证测试过程中发生了什么。

谢谢!

1 个答案:

答案 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和一个更新语句。