Использование переменной в предложении LIMIT в MySQL - PullRequest
37 голосов
/ 29 октября 2008

Я пишу хранимую процедуру, где у меня есть входной параметр с именем my_size , то есть INTEGER . Я хочу использовать его в выражении LIMIT в выражении SELECT. Видимо, это не поддерживается, есть ли способ обойти это?

# I want something like:
SELECT * FROM some_table LIMIT my_size;

# Instead of hardcoding a permanent limit:
SELECT * FROM some_table LIMIT 100;

Ответы [ 7 ]

22 голосов
/ 12 июня 2013

Для тех, кто не может использовать MySQL 5.5.6+ и не хочет писать хранимую процедуру, есть другой вариант. Мы можем добавить предложение where на подвыбор с помощью ROWNUM.

SET @limit = 10;
SELECT * FROM (
  SELECT instances.*, 
         @rownum := @rownum + 1 AS rank
    FROM instances, 
         (SELECT @rownum := 0) r
) d WHERE rank < @limit;
14 голосов
/ 05 апреля 2012

ХРАНЕННАЯ ПРОЦЕДУРА

DELIMITER $
create PROCEDURE get_users(page_from INT, page_size INT)
begin
SET @_page_from = page_from;
SET @_page_size = page_size;
PREPARE stmt FROM "select u.user_id, u.firstname, u.lastname from users u limit ?, ?;";
EXECUTE stmt USING @_page_from, @_page_size;
DEALLOCATE PREPARE stmt;
end$
DELIMITER ;

* 1007 USAGE *

call get_users(1, 10);
12 голосов
/ 13 августа 2011

Я знаю, что этот ответ пришел поздно, но попробуйте SQL_SELECT_LIMIT.

Пример:

Declare rowCount int;
Set rowCount = 100;
Set SQL_SELECT_LIMIT = rowCount;
Select blah blah
Set SQL_SELECT_LIMIT = Default;
10 голосов
/ 29 октября 2008

Поиском оказался этой статьей . Я вставил соответствующий текст ниже.

Вот сообщение на форуме с примером готовых высказываний, позволяющих Вы назначаете значение переменной для предложения limit:

http://forums.mysql.com/read.php?98,126379,133966#msg-133966

Тем не менее, я думаю, что эта ошибка должна привлечь внимание, потому что я не могу Представьте, что подготовленные заявления в рамках процедуры позволят оптимизация времени компиляции. У меня есть ощущение, что подготовлен операторы компилируются и выполняются во время выполнения процедуры, какие пробабы негативно влияют на эффективность. Если предел предложение может принимать нормальные переменные процедуры (скажем, процедуру аргумент), то база данных может выполнять компиляцию оптимизация остальной части запроса, в рамках процедуры. это вероятно, приведет к более быстрому выполнению процедуры. Я не эксперт хотя.

9 голосов
/ 22 января 2012

Эта функция была добавлена ​​в MySQL 5.5.6. Проверьте эту ссылку out.

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

2 голосов
/ 13 февраля 2013

Другой способ, такой же, как написано "Pradeep Sanjaya", но с использованием CONCAT:

CREATE PROCEDURE `some_func`(startIndex INT, countNum INT)
READS SQL DATA
  COMMENT 'example'
BEGIN
  SET @asd = CONCAT('SELECT `id` FROM `table` LIMIT ',startIndex,',',countNum);
  PREPARE zxc FROM @asd;
  EXECUTE zxc;
END;
1 голос
/ 03 июня 2015

Начиная с версии MySQL 5.5.6, вы можете указать LIMIT и OFFSET с переменными / параметрами.

Для справки см. Руководство 5.5 , руководство 5.6 и ответ @ Quassnoi

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