Выполните ОБНОВЛЕНИЕ и настройку пользовательской переменной в одном запросе

Каждый, кто знаком с командой php mysql_query, знает, что она не позволяет нам выполнять более одного запроса (разделенного; разделителем) за один вызов...

Моя проблема в том, что я не смогу определить пользовательскую переменную в своем запросе UPDATE, чтобы я увеличивал ее для каждой строки (что-то вроде автоматического увеличения). Это должно выглядеть примерно так:

SET @t1=0;
UPDATE `mytable` SET `order` = (@t1:=(@t1+1)) ORDER BY `order` ASC;

Моя проблема в том, что, поскольку я не могу определить свою переменную, а затем выполнить обновление, я не могу найти способ установить переменную внутри запроса. Я пытался определить это, если это было NULL:

... `order` = (IFNULL( @t1 := ( @t1 + 1 ) , @t1 := 0 )) ...

но это не сработало, поскольку переменная сбрасывается в каждой строке, с которой она работает.

Кто-нибудь знаком с MySQL, который видит решение? Заранее спасибо.

3 ответа

Старый вопрос, но в любом случае вот ответ:

UPDATE `mytable` SET `order` = (@t1 := IFNULL(@t1, 0) + 1) ORDER BY `order` ASC;

IFNULL(@t1, 0) возвращает 0, если @t1 не имеет значения или возвращает значение @t1 если это имеет значение.

Итак, на первом ряду @t1 не установлен и обновляется как order = (@t1 := 0 + 1) и в следующих строках @t1 уже имеет значение и добавляет +1 к каждой строке.

Вы можете использовать библиотеку mysqli, она позволяет использовать несколько запросов в одном запросе, используя

mysqli->multiple_query( string $querys);

http://us.php.net/mysqli_multi_query

Выходя на конечности, как насчет...

... `order` = (ВЫБЕРИТЕ`order`+1 ИЗ `mytable` ORDER BY `order` DESC LIMIT 1)

или что-то подобное в качестве подзапроса?... Я не уверен, что подзапрос перезапускается после каждого обновления, но если это так, он должен выбрать ранее самый высокий order значение и увеличить его?

Другие вопросы по тегам