我对
的效果有疑问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,但我认为这非常通用。
答案 0 :(得分:53)
MySQL中有一个很好的解决方案。
在关键字SELECT:
后面添加关键字SQL_CALC_FOUND_ROWSSELECT 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时找到计数。