我正在编写一个存储过程,其中有一个名为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;
ENargit.. 22
对于那些不能使用MySQL 5.5.6+并且不想编写存储过程的人,还有另一种变体.我们可以使用ROWNUM在subselect上添加where子句.
SET @limit = 10; SELECT * FROM ( SELECT instances.*, @rownum := @rownum + 1 AS rank FROM instances, (SELECT @rownum := 0) r ) d WHERE rank < @limit;
Pradeep Sanj.. 14
存储过程
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);
user888112.. 13
我知道这个答案来得晚,但请尝试SQL_SELECT_LIMIT.
例:
Declare rowCount int; Set rowCount = 100; Set SQL_SELECT_LIMIT = rowCount; Select blah blah Set SQL_SELECT_LIMIT = Default;
不幸的是,似乎不支持起始位置的参数,比如5,2从位置5获取2行.但除非你需要,它可能会起作用. (2认同)
TheSoftwareJ.. 10
搜索出现在这篇文章中.我已粘贴下面的相关文字.
这是一个论坛帖子,显示了一个准备好的语句示例,允许您为limit子句分配变量值:
http://forums.mysql.com/read.php?98,126379,133966#msg-133966
但是,我认为这个bug应该得到一些关注,因为我无法想象一个过程中的预处理语句将允许任何过程 - 编译时优化.我感觉准备好的语句是在程序的运行时编译和执行的,这会对效率产生负面影响.如果limit子句可以接受正常的过程变量(例如,过程参数),那么数据库仍然可以在过程中对查询的其余部分执行编译时优化.这可能会更快地执行该过程.我不是专家.
Jiho Kang.. 9
此功能已添加到MySQL 5.5.6中.检查此链接.
我已经升级到MySQL 5.5只是为了这个功能而且效果很好.5.5还有很多性能升级,我完全推荐它.
对于那些不能使用MySQL 5.5.6+并且不想编写存储过程的人,还有另一种变体.我们可以使用ROWNUM在subselect上添加where子句.
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;
搜索出现在这篇文章中.我已粘贴下面的相关文字.
这是一个论坛帖子,显示了一个准备好的语句示例,允许您为limit子句分配变量值:
http://forums.mysql.com/read.php?98,126379,133966#msg-133966
但是,我认为这个bug应该得到一些关注,因为我无法想象一个过程中的预处理语句将允许任何过程 - 编译时优化.我感觉准备好的语句是在程序的运行时编译和执行的,这会对效率产生负面影响.如果limit子句可以接受正常的过程变量(例如,过程参数),那么数据库仍然可以在过程中对查询的其余部分执行编译时优化.这可能会更快地执行该过程.我不是专家.
此功能已添加到MySQL 5.5.6中.检查此链接.
我已经升级到MySQL 5.5只是为了这个功能而且效果很好.5.5还有很多性能升级,我完全推荐它.