使用LIMIT在MySQL查询中分页结果

时间:2012-07-30 19:59:42

标签: mysql pagination limit

我想一次取一个'页面'的结果;我希望页码是一个参数(在JDBC预处理语句中)。请考虑以下代码段

SELECT * FROM thread t ORDER BY t.id LIMIT ((? - 1) * 20), 20

理想情况下,对于第1页,这会导致LIMIT 0, 20

当我测试时

SELECT * FROM thread t ORDER BY t.id LIMIT ((1 - 1) * 20), 20

我被告知我有语法错误。我不知道它可能是什么 - 它只是一些简单的数学。它告诉我的全部是

  

错误1064(42000):您的SQL语法有错误;检查手册   对应于您的MySQL服务器版本,以便在'附近使用正确的语法((1 -    1)* 20),第1行20'

我的LIMIT条款有什么问题,我该如何解决?

3 个答案:

答案 0 :(得分:12)

这不可能。

请在此处查看解决方案:  MySQL Math and COUNT(*) in LIMIT

我建议使用javascript或其他东西来处理第一个参数(即偏移量),例如: 第一页为limit 0,20,第二页为limit 21,20 ...

例如,如果您的第一页在网址www.example.com?page=1

中有一个获取变量
offset = (page - 1)*20 ;
row_count = 20;
select * from table limit (offset, row_count);

答案 1 :(得分:8)

MySQL需要使用LIMIT语法的数字常量。

来自http://dev.mysql.com/doc/refman/5.7/en/select.html

  

LIMIT子句可用于约束SELECT语句返回的行数。 LIMIT需要一个或两个数字参数,它们都必须是非负整数常量,但有以下例外:

     
      
  • 在预准备语句中,可以使用?指定LIMIT参数?占位符标记。

  •   
  • 在存储的程序中,可以使用整数值例程参数或局部变量指定LIMIT参数。

  •   

计算Java端的常量。

答案 2 :(得分:7)

为查询定义偏移量。

例如

如果你想要第1页(记录1-10)offset = 0,limit = 10;对于第2页(记录11-20)偏移= 20,极限= 10;并使用以下查询:

SELECT column FROM table LIMIT {someLimit} OFFSET {someOffset};

示例:

SELECT column FROM table
LIMIT 10 OFFSET 10;