Подтвердить что ты не робот

Переменная LIMIT в MySQL

Я пишу хранимую процедуру, где у меня есть входной параметр my_size, который является int, я хочу иметь возможность использовать в предложении 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;
4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

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

Пример:

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

Ответ 4

ЗАПОМНЕННАЯ ПРОЦЕДУРА

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);

Ответ 5

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

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

Ответ 6

Другой способ, так же, как написать "Прадип Санджая", но используя 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;

Ответ 7

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

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