6

目前我运行两个 MySQL 查询来处理我的分页...

查询 1 从表中选择所有行,因此我知道需要列出多少页。

查询 2 选择当前页面的行(例如:第 1 页的第 0 到 19 行(LIMIT 0, 19),第 2 页的第 20-39 行等)。

这似乎浪费了两个重复查询,唯一的区别是 LIMIT 部分。

有什么更好的方法来做到这一点?

我应该在运行一个查询后使用 PHP 过滤结果吗?

编辑:我应该运行一个查询并使用类似 array_slice() 的东西来只列出我想要的行吗?

4

2 回答 2

2

最好和最快的方法是使用 2 个 MYSQL 查询进行分页(正如您已经在使用的那样),为了避免过度头痛,您必须通过仅选择一列(比如主键)来简化用于找出总行数的查询够了。 SELECT * FROM sampletable WHERE condition1>1 AND condition2>2 对于这样的查询分页,您可以使用这两个查询 SELECT * FROM sampletable WHERE condition1>1 AND condition2>2 LIMIT 0,20 SELECT id FROM sampletable WHERE condition1>1 AND condition2>2

于 2012-06-07T04:42:38.893 回答
0

采用FOUND_ROWS()

一个 SELECT 语句可能包含一个 LIMIT 子句来限制服务器返回给客户端的行数。在某些情况下,希望知道在没有 LIMIT 的情况下该语句将返回多少行,但无需再次运行该语句。要获取此行数,请在 SELECT 语句中包含 SQL_CALC_FOUND_ROWS 选项,然后调用 FOUND_ROWS():

mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name
    -> WHERE id > 100 LIMIT 10;
mysql> SELECT FOUND_ROWS();

第二个 SELECT 返回一个数字,表示如果没有 LIMIT 子句,第一个 SELECT 将返回多少行。

请注意,这会给数据库带来额外的压力,因为它每次都必须找出完整结果集的大小。SQL_CALC_FOUND_ROWS仅在需要时使用。

于 2012-06-06T09:22:12.693 回答