2012-06-01 51 views
6

目前我运行两个MySQL查询来处理我的分页...有效使用分页和MySQL查询

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

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

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

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

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

编辑︰我应该运行一个查询,并使用像array_slice()只列出我想要的行吗?

+0

您正在寻找这样的事情:http://stackoverflow.com/questions/802373/how-to-count-and-limit-record -in-a-single-query-in-mysql –

+0

有趣的是,该帖子中的答案建议使用两个查询,而不是那个假设的“黑客”......嗯...... –

+0

你是不是在q1上使用count()?为什么? – Teson

回答

3

最好的&最快的方法是使用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

+0

这就是OP在说什么。他不希望解雇2个问题。他希望总行数和单个查询中的结果有限。看我的解决方案。 –

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条款。

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

+1

found_rows()是一个可怕的想法,尤其是因为SQL_CALC_FOUND_ROWS将获取所有行,即使您只需要前20行。所以基本上你可以获取x条记录,而你真的需要20条记录。如果x以百万为单位,并且您的查询有许多联结,那么您会让您的用户等待很长时间! –