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

7
我希望能够按“页”获取我的结果; 我希望页码可以作为参数(在JDBC准备语句中)。请考虑以下代码片段。
SELECT * FROM thread t ORDER BY t.id LIMIT ((? - 1) * 20), 20
理想情况下,对于第一页,会得到LIMIT 0, 20的结果。 当我进行测试时。
SELECT * FROM thread t ORDER BY t.id LIMIT ((1 - 1) * 20), 20
我被告知有语法错误,但我看不出来哪里错了——只是一些简单的数学。所有的提示都是:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '((1 - 1) * 20), 20' at line 1

我的LIMIT子句有什么问题?我该如何修复它?
3个回答

18

无法完成此操作。

请查看解决方案: 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);

最优的做法是使用类似这样的代码。这个代码比你需要在表格上进行计数,然后将该计数结果用作新参数的两个查询要快得多,因为表格中可能有n行... 表格越大,查询效率就越低。 - Shawn

12

使用以下语法定义查询的偏移量

SELECT column FROM table 
LIMIT {someLimit} OFFSET {someOffset};
例如,要获取第1页(记录1-10),将偏移量设置为0,限制数量设置为10;
SELECT column FROM table 
LIMIT 10 OFFSET 0;
要获取第二页(记录11-20),请将偏移量设置为10,而限制为10。
SELECT column FROM table 
LIMIT 10 OFFSET 10;

10
MySQL要求使用数字常量来限制语法中的LIMIT。

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

LIMIT子句可用于限制SELECT语句返回的行数。LIMIT需要一个或两个数字参数,这些参数都必须是非负整数常量,其中以下两种情况除外:
  • 在准备好的语句中,可以使用?占位符标记指定LIMIT参数。
  • 在存储的程序中,可以使用整数值例程参数或局部变量指定LIMIT参数。

在Java端计算常量。

1
那么它为什么不能将((1-1)*20)作为常量进行评估,即使它由纯常量组成?这似乎是一个奇怪的限制。我原以为它被视为常量,因为它不包含变量...但至少现在我知道该怎么做了!谢谢。 - corsiKa
是的,从数学角度来看,您正在表示一个“常量”((1-1)*20始终相同)...但从解析器的角度来看,MySQL并不处于数学表达式解析的心情中 :) - Matt
2
我刚刚用 limit ?, 20 替换了有问题的代码,并使用 pageStart = (page - 1) * 20;,它完美地工作了。现在开始解决下一个 bug :) - corsiKa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,