bash.org:

Следуй за мной:

twiby

Адовый чад кутежа и трэш в комплекте

Переменная в условии LIMIT Mysql

Пришло на ум: 13 февраля 2013


Попалась интересная задача - обновить часть таблицы (50%) по определенному условию.

Вроде как бы довольно просто (упрощенный пример):

SET @limit = ROUND((SELECT COUNT( * ) FROM user) / 2);

UPDATE user SET is_active = 0 LIMIT @limit;

Казалось бы, выбирай, да ставь лимит. Не работает. :

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '@limit LIMIT 0, 30' at line 1

Нормальных, адекватных решений по этой теме нету. Самое простое рабочее решение заключается добавлении процедуры которая клеит лимит к prepared statement запросу:

DELIMITER **;
CREATE PROCEDURE `use_limit_variable`(startIndex INT, countNum INT)

BEGIN
  SET @query = CONCAT('UPDATE user SET is_active = 0 LIMIT ', startIndex, ',' , countNum);
  PREPARE q FROM @query;
  EXECUTE q;
  DEALLOCATE PREPARE q;
END;

DELIMITER;

Или вот так:

DELIMITER $
CREATE PROCEDURE `use_limit_variable`(startIndex INT, countNum INT)
  BEGIN 
  SET @startIndex = startIndex;
  SET @countNum = countNum;
  PREPARE q FROM "UPDATE user SET is_active = 0 LIMIT ?,?;";
  EXECUTE q USING @startIndex, @countNum;
  DEALLOCATE PREPARE q;
END$
DELIMITER ;

Через phpmyadmin могут возникнуть проблемы с добавлением процедуры, лучше использовать сторонний софт или добавлять процедуру в консоли

Запуск процедуры:

CALL use_limit_variable(0, ROUND((SELECT COUNT( * ) FROM user) / 2));

Если мой пост помог вам сэкономить пару часов времени или показался полезным, думаю не лишним будет показать его друзьям через социальные сети или упомянуть в своем блоге.


Ваше мнение:

Имя

анан : 2016-05-03 15:15:08

полезно еще как

evgen : 2016-09-05 11:27:00

решал подобное с помошью перенесения условия limit в where как то так: where (@inc < @count)

Павел : 2016-12-01 00:59:05

Спасибо за оригинальное решение.
   другие статьи с тегом MySQL

Случайная мысль:

Мир в точности таков, каким мы его видим.
Пауло Коэльо
drcreazy © 2008-2012 all rights reserved