【问题标题】:Getting the number of rows with a GROUP BY query使用 GROUP BY 查询获取行数
【发布时间】:2010-09-26 18:16:55
【问题描述】:

我有一个查询

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

【问题讨论】:

标签: sql mysql


【解决方案1】:

您正在使用 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

【讨论】:

  • SQL_CALC_FOUND_ROWS 查询修饰符和随附的 FOUND_ROWS() 函数自 MySQL 8.0.17 起已弃用,并将在未来的 MySQL 版本中删除。 dev.mysql.com/doc/refman/8.0/en/…
  • 谢谢,好建议。我在 2008 年回答了这个问题,从那以后我看到了显示 SQL_CALC_FOUND_ROWS 导致性能问题的基准。有时(取决于您扫描的数据量),您最好运行 两个 查询,一个到 COUNT(*),第二个用 LIMIT 运行查询,而不是 SQL_CALC_FOUND_ROWS。
【解决方案2】:

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

【讨论】:

【解决方案3】:

“一堆其他东西”都是聚合体吗?我假设是这样,因为您的 GROUP BY 只有 t3.id。如果是这种情况,那么这应该有效:

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

当然还有一个选择:

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

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

【讨论】:

  • 在 MySQL 中这会出错,但如果您为生成的表添加别名,这可能是一个不错的解决方案。否则你会得到错误:“每个派生表都必须有自己的别名”。所以一定要写这样的东西: select count(*) from (your query) as resultTable
  • 第一个选项非常适合我!谢谢朋友
【解决方案4】:

使用子查询:

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

【讨论】:

    【解决方案5】:

    所有给出的 ans 都会执行查询,然后找到计数。在大型数据集上,Distinct 肯定比 group by 慢。

    查找分组计数的最佳方法如下

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

    这将在计算分组依据时找到计数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多