猿问
下载APP

在MySQL中的LIMIT子句中使用变量

在MySQL中的LIMIT子句中使用变量

我正在编写一个存储过程,其中有一个名为my_size的输入参数,它是一个INTEGER。我希望能够LIMITSELECT声明中的子句中使用它。显然这是不支持的,有没有办法解决这个问题?

# I want something like:SELECT * FROM some_table LIMIT my_size;# Instead of hardcoding a permanent limit:SELECT * FROM some_table LIMIT 100;


红颜莎娜
浏览 62回答 3
3回答

慕娘9325324

搜索出现在这篇文章中。我已粘贴下面的相关文字。这是一个论坛帖子,显示了一个准备好的语句示例,允许您为limit子句分配变量值:http://forums.mysql.com/read.php?98,126379,133966#msg-133966但是,我认为这个bug应该得到一些关注,因为我无法想象一个过程中的预处理语句将允许任何过程 - 编译时优化。我感觉准备好的语句是在程序的运行时编译和执行的,这会对效率产生负面影响。如果limit子句可以接受正常的过程变量(例如,过程参数),那么数据库仍然可以在过程中对查询的其余部分执行编译时优化。这可能会更快地执行该过程。我不是专家。

绝地无双

对于那些不能使用MySQL 5.5.6+并且不想编写存储过程的人,还有另一种变体。我们可以使用ROWNUM在subselect上添加where子句。SET&nbsp;@limit&nbsp;=&nbsp;10;SELECT&nbsp;*&nbsp;FROM&nbsp;( &nbsp;&nbsp;SELECT&nbsp;instances.*,&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@rownum&nbsp;:=&nbsp;@rownum&nbsp;+&nbsp;1&nbsp;AS&nbsp;rank&nbsp;&nbsp;&nbsp;&nbsp;FROM&nbsp;instances,&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(SELECT&nbsp;@rownum&nbsp;:=&nbsp;0)&nbsp;r)&nbsp;d&nbsp;WHERE&nbsp;rank&nbsp;<&nbsp;@limit;

DIEA

存储过程DELIMITER $create PROCEDURE get_users(page_from INT, page_size INT)beginSET @_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);
打开App,查看更多内容
随时随地看视频慕课网APP
我要回答