使用GROUP BY查询获取行数

时间:2008-12-13 04:14:16

标签: sql mysql

我对

的效果有疑问
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

我想知道这个查询会在没有LIMIT的情况下返回很多行(所以我可以显示分页信息)。

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

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,但我认为这非常通用。

5 个答案:

答案 0 :(得分:53)

MySQL中有一个很好的解决方案。

在关键字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

答案 1 :(得分:50)

“一堆其他东西”都聚集在一起吗?我假设是因为你的GROUP BY只有t3.id.如果是这样,那么这应该有效:

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

另一种选择当然是:

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

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

答案 2 :(得分:12)

使用子查询:

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包含行数。

答案 3 :(得分:11)

您正在使用MySQL,因此您可以使用它们的功能来完成此操作。

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

答案 4 :(得分:1)

所有ans将执行查询,然后查找计数。在大型数据集中,Distinct肯定比group by慢。

查找分组计数的最佳方法是

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

这将在计算group by时找到计数。