使用GROUP BY查询获取行数

Soa*_*Box 57 mysql sql

我有一个查询的效果

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
Run Code Online (Sandbox Code Playgroud)

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

通常,我会使用此查询:

SELECT COUNT(t3.id) FROM t1, t2, t3 
WHERE (associate t1,t2, and t3 with each other) 
GROUP BY t3.id
Run Code Online (Sandbox Code Playgroud)

但是,GROUP BY更改了COUNT的含义,而是获得了一组行,表示每个组中唯一的t3.id值的数量.

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

Syl*_*ain 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
Run Code Online (Sandbox Code Playgroud)

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

SELECT FOUND_ROWS();
Run Code Online (Sandbox Code Playgroud)

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

有关更多信息,请访问此页面:http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_found-rows

  • 由于免责声明我自己没有对调用进行基准测试,因此本文将我从解决方案中解脱出来:http://www.mysqlperformanceblog.com/2007/08/28/to-sql_calc_found_rows-or-not-to-sql_calc_found_rows/ (3认同)
  • 从 MySQL 8.0.17 开始,SQL_CALC_FOUND_ROWS 查询修饰符和随附的 FOUND_ROWS() 函数已弃用,并将在未来的 MySQL 版本中删除。https://dev.mysql.com/doc/refman/8.0/en/information-functions.html#function_found-rows (2认同)

Tom*_*m H 50

"一堆其他东西"都聚集在一起吗?我假设是因为你的GROUP BY只有t3.id. 如果是这种情况那么这应该工作:

SELECT
     COUNT(DISTINCT t3.id)
FROM...
Run Code Online (Sandbox Code Playgroud)

另一种选择当然是:

SELECT
     COUNT(*)
FROM
     (
     <Your query here>
     ) AS SQ
Run Code Online (Sandbox Code Playgroud)

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

  • 在MySQL中,这将是错误,但如果为生成的表添加别名,它可能是一个好的解决方案.否则你会收到错误:"每个派生表必须有自己的别名".所以一定要写一下:从(你的查询)中选择count(*)作为resultTable (2认同)

Sil*_*oon 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;
Run Code Online (Sandbox Code Playgroud)

所以temp包含行数.


Bil*_*win 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
Run Code Online (Sandbox Code Playgroud)

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