我的iPhone应用程序连接到我的PHP web服务从MySQL数据库中检索数据,一个请求可以返回500个结果。

实现分页和一次检索20个项的最佳方法是什么?

假设我从数据库中接收了前20个条目,我现在如何请求接下来的20个条目?


当前回答

从MySQL文档:

The LIMIT clause can be used to constrain the number of rows returned by the SELECT statement. LIMIT takes one or two numeric arguments, which must both be nonnegative integer constants (except when using prepared statements). With two arguments, the first argument specifies the offset of the first row to return, and the second specifies the maximum number of rows to return. The offset of the initial row is 0 (not 1): SELECT * FROM tbl LIMIT 5,10; # Retrieve rows 6-15 To retrieve all rows from a certain offset up to the end of the result set, you can use some large number for the second parameter. This statement retrieves all rows from the 96th row to the last: SELECT * FROM tbl LIMIT 95,18446744073709551615; With one argument, the value specifies the number of rows to return from the beginning of the result set: SELECT * FROM tbl LIMIT 5; # Retrieve first 5 rows In other words, LIMIT row_count is equivalent to LIMIT 0, row_count.

其他回答

对于500条记录,效率可能不是问题,但如果你有数百万条记录,那么使用WHERE子句来选择下一页可能会更有利:

SELECT *
FROM yourtable
WHERE id > 234374
ORDER BY id
LIMIT 20

这里的“234374”是您查看的上一页中最后一条记录的id。

这将使id上的索引能够用于查找第一条记录。如果你使用LIMIT偏移量,20,你会发现它变得越来越慢,随着你的页面接近尾声。正如我所说的,如果只有200条记录,这可能无关紧要,但如果结果集更大,情况就不同了。

Another advantage of this approach is that if the data changes between the calls you won't miss records or get a repeated record. This is because adding or removing a row means that the offset of all the rows after it changes. In your case it's probably not important - I guess your pool of adverts doesn't change too often and anyway no-one would notice if they get the same ad twice in a row - but if you're looking for the "best way" then this is another thing to keep in mind when choosing which approach to use.

如果您确实希望使用带有偏移量的LIMIT(如果用户直接导航到页10000,而不是逐个分页,这是必要的),那么您可以阅读这篇关于晚期行查找的文章,以提高带有较大偏移量的LIMIT的性能。

从MySQL文档:

The LIMIT clause can be used to constrain the number of rows returned by the SELECT statement. LIMIT takes one or two numeric arguments, which must both be nonnegative integer constants (except when using prepared statements). With two arguments, the first argument specifies the offset of the first row to return, and the second specifies the maximum number of rows to return. The offset of the initial row is 0 (not 1): SELECT * FROM tbl LIMIT 5,10; # Retrieve rows 6-15 To retrieve all rows from a certain offset up to the end of the result set, you can use some large number for the second parameter. This statement retrieves all rows from the 96th row to the last: SELECT * FROM tbl LIMIT 95,18446744073709551615; With one argument, the value specifies the number of rows to return from the beginning of the result set: SELECT * FROM tbl LIMIT 5; # Retrieve first 5 rows In other words, LIMIT row_count is equivalent to LIMIT 0, row_count.

如果您希望在存储过程中执行此操作,可以尝试此操作

SELECT * FROM tbl limit 0, 20.

不幸的是,使用公式不起作用,所以你可以执行一个准备好的语句,或者只是给过程的开始和结束值。

为查询定义OFFSET。例如

Page 1-(记录01-10):offset = 0, limit=10;

第2页-(记录11-20)offset =10, limit =10;

并使用以下查询:

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

第2页示例:

SELECT column FROM table
LIMIT 10 OFFSET 10;

你也可以

SELECT SQL_CALC_FOUND_ROWS * FROM tbl limit 0, 20

select语句的行数(没有限制)在同一个select语句中捕获,因此您不需要再次查询表大小。 使用SELECT FOUND_ROWS()获取行数;