当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在MySQL中的LIMIT子句中使用变量》经验,为你挑选了5个好方法。

我正在编写一个存储过程,其中有一个名为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;

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还有很多性能升级,我完全推荐它.



1> ENargit..:

对于那些不能使用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;



2> Pradeep Sanj..:

存储过程

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



3> user888112..:

我知道这个答案来得晚,但请尝试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行.但除非你需要,它可能会起作用.

4> TheSoftwareJ..:

搜索出现在这篇文章中.我已粘贴下面的相关文字.

这是一个论坛帖子,显示了一个准备好的语句示例,允许您为limit子句分配变量值:

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

但是,我认为这个bug应该得到一些关注,因为我无法想象一个过程中的预处理语句将允许任何过程 - 编译时优化.我感觉准备好的语句是在程序的运行时编译和执行的,这会对效率产生负面影响.如果limit子句可以接受正常的过程变量(例如,过程参数),那么数据库仍然可以在过程中对查询的其余部分执行编译时优化.这可能会更快地执行该过程.我不是专家.



5> Jiho Kang..:

此功能已添加到MySQL 5.5.6中.检查此链接.

我已经升级到MySQL 5.5只是为了这个功能而且效果很好.5.5还有很多性能升级,我完全推荐它.

推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有