Sequel Pro множественный запрос на обновление с регистром и случайной величиной - PullRequest
0 голосов
/ 21 октября 2011

Хорошо, у меня есть таблица с полем подсчета от 0 до 100. До шести из этих полей связаны с одним идентификатором. Мне нужно запустить обновление, которое уменьшит каждую из этих строк на другое случайное число от 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';

Теперь я не хочу сохранять только одну переменную, потому что мне может понадобиться до 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 голосов
/ 21 октября 2011

Возможно, вам лучше всего написать процедуру для этого. Таким образом, вы могли бы написать что-нибудь в степени (псевдокод)

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
//

Или вы можете изменить процедуру для принятия идентификатора, как у меня раньше, и просто использовать один оператор выбора и один оператор обновления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...