Использование переменной в предложении LIMIT в MySQL

StackOverflow https://stackoverflow.com/questions/245180

  •  05-07-2019
  •  | 
  •  

Вопрос

Я пишу хранимую процедуру, в которой у меня есть входной параметр с именем мой размер это ЦЕЛОЕ ЧИСЛО.Я хочу иметь возможность использовать его в 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;
Это было полезно?

Решение

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

  

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

     

http://forums.mysql.com/read. PHP? 98,126379,133966 # сообщ-133966

     

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

Другие советы

Для тех, кто не может использовать 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;

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

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 ;

ИСПОЛЬЗОВАНИЕ

call get_users(1, 10);

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

Пример:

Declare rowCount int;
Set rowCount = 100;
Set SQL_SELECT_LIMIT = rowCount;
Select blah blah
Set SQL_SELECT_LIMIT = Default;

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

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

Другой способ, такой же, как написано "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;

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top