Выполните ОБНОВЛЕНИЕ и настройку пользовательской переменной в одном запросе. - PullRequest
2 голосов
/ 01 марта 2009

Каждый, кто знаком с командой 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 ]

3 голосов
/ 01 июля 2011

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

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 к каждой строке.

1 голос
/ 01 марта 2009

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

mysqli->multiple_query( string $querys);

http://us.php.net/mysqli_multi_query

0 голосов
/ 01 марта 2009

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

... `order` = (SELECT `order`+1 FROM `mytable` ORDER BY `order` DESC LIMIT 1)

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

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