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

cor*_*iKa 6 mysql pagination limit

我希望一次将结果作为"页面"获取; 我希望页码是一个参数(在JDBC预处理语句中).请考虑以下代码段

SELECT * FROM thread t ORDER BY t.id LIMIT ((? - 1) * 20), 20
Run Code Online (Sandbox Code Playgroud)

理想情况下,这将导致第1页的结果LIMIT 0, 20.

当我测试

SELECT * FROM thread t ORDER BY t.id LIMIT ((1 - 1) * 20), 20
Run Code Online (Sandbox Code Playgroud)

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

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

我的LIMIT条款我做错了什么,我该如何解决?

Sha*_*awn 13

这是不可能做到的.

请参阅此处的解决方案: LIM Math中的MySQL Math和COUNT(*)

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

例如,如果您的第一页在网址www.example.com?page=1中有一个get变量

offset = (page - 1)*20 ;
row_count = 20;
select * from table limit (offset, row_count);
Run Code Online (Sandbox Code Playgroud)


Mat*_*att 9

MySQL需要LIMIT语法的数字常量.

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

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

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

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

计算Java端的常量.

  • 我只是用`limit?,20`替换了违规代码并使用`pageStart =(page-1)*20;`它就像一个魅力.现在到下一个bug :) (2认同)

小智 7

定义查询的偏移量.

例如

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

SELECT column FROM table 
LIMIT {someLimit} OFFSET {someOffset};
Run Code Online (Sandbox Code Playgroud)

例:

SELECT column FROM table 
LIMIT 10 OFFSET 0;
Run Code Online (Sandbox Code Playgroud)