通过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计数。