通过GROUP BY查询获取行数

我有一个查询的效果

SELECT t3.id, a,bunch,of,other,stuff FROM t1, t2, t3 WHERE (associate t1,t2, and t3 with each other) GROUP BY t3.id LIMIT 10,20 

我想知道很多总行这个查询将返回没有极限(所以我可以显示分页信息)。

通常情况下,我会使用这个查询:

 SELECT COUNT(t3.id) FROM t1, t2, t3 WHERE (associate t1,t2, and t3 with each other) GROUP BY t3.id 

然而,GROUP BY改变了COUNT的含义,而我得到了一组代表每个组中唯一t3.id值的数目的行。

当我使用GROUP BY时,有没有办法获得总数的计数? 我想避免必须执行整个查询,并只计算行数,因为我只需要行的一个子集,因为值分页。 我正在使用MySQL 5,但我认为这很通用。

在MySQL中有一个很好的解决scheme。

在关键字SELECT之后添加关键字SQL_CALC_FOUND_ROWS:

 SELECT SQL_CALC_FOUND_ROWS t3.id, a,bunch,of,other,stuff FROM t1, t2, t3 WHERE (associate t1,t2, and t3 with each other) GROUP BY t3.id LIMIT 10,20 

之后,使用函数FOUND_ROWS()运行另一个查询:

 SELECT FOUND_ROWS(); 

它应该返回没有LIMIT子句的行数。

在此页面查看更多信息: http : //dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_found-rows

“一堆其他的东西”是所有的聚合? 我假设,因为你的GROUP BY只有t3.id. 如果是这样的话,这应该工作:

 SELECT COUNT(DISTINCT t3.id) FROM... 

另一种select当然是:

 SELECT COUNT(*) FROM ( <Your query here> ) AS SQ 

我不使用MySQL,所以我不知道这些查询是否会在那里工作。

使用子查询:

 SELECT COUNT(*) FROM ( SELECT t3.id, a,bunch,of,other,stuff FROM t1, t2, t3 WHERE (associate t1,t2, and t3 with each other) GROUP BY t3.id ) as temp; 

所以temp包含了行数。

你正在使用MySQL,所以你可以使用他们的function来做到这一点。

 SELECT SQL_CALC_FOUND_ROWS t3.id, a,bunch,of,other,stuff FROM t1, t2, t3 WHERE (associate t1,t2, and t3 with each other) GROUP BY t3.id LIMIT 10,20; SELECT FOUND_ROWS(); -- for most recent query 

http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_found-rows

所有答案将执行查询,然后find计数。 在大数据集上,差别肯定比组慢。

最好的方法来find组的人数是在下面

 SELECT sum(1) as counttotal FROM ( Your query with group by operator ) as T 

这将通过计算组find计数。