【问题标题】:Count rows in MySQL along with the actual row contents计算 MySQL 中的行以及实际的行内容
【发布时间】:2013-05-18 04:40:18
【问题描述】:

在 MySQL 中是否有一种方法可以执行单个 SQL 语句来返回选定的行以及结果行的计数?

我可以这样做:

SELECT COUNT(*) FROM BigTable WHERE firstname LIKE 'a%';

这给了我一个带有计数 (37,781) 的结果行。我可以像这样得到实际的行数据:

SELECT firstname FROM BigTable WHERE firstname LIKE 'a%';

显示实际的 37,781 行。但是当我尝试将它们结合起来时,就像这样:

SELECT firstname, COUNT(*) FROM BigTable WHERE firstname LIKE 'a%';

我得到一行,其中第一行与查询匹配,以及与查询匹配的记录总数。

我希望看到的是包含 37,781 行的两列。第一列应包含每行的名字,第二列应包含每行的数字“37,781”。有没有办法编写查询来完成此操作?

【问题讨论】:

    标签: mysql count rows


    【解决方案1】:

    您可以使用交叉连接。子查询将获取所有 firstnames 的计数,然后它将在每一行中包含此值:

    SELECT firstname, d.total
    FROM BigTable
    CROSS JOIN 
    (
       SELECT COUNT(*) total
       FROM BigTable
       WHERE firstname LIKE 'a%'
    ) d
    WHERE firstname LIKE 'a%';
    

    SQL Fiddle with Demo

    【讨论】:

    • 谢谢,效果很好。 Barmar 的回答也有效,但这比其他方法(约 6.5 秒)略快(约 5.75 秒)。
    • SQL Fiddle 很棒。我没听说过。感谢您的提示。
    • @BrianMoore SQL Fiddle 是由 StackOverflow 用户编写的! :)
    【解决方案2】:

    您可以使用子查询加入:

    SELECT firstname, ct
    FROM BigTable
    JOIN (SELECT COUNT(*) ct
          FROM BigTable
          WHERE firstname LIKE 'a%') x ON (1 = 1)
    WHERE firstname LIKE 'a%'
    

    【讨论】:

    • 谢谢巴尔玛!我对此进行了测试,它完全符合我的要求。
    【解决方案3】:

    交叉连接不是有效的方法,更好的方法是使用内联SELECT,如下结构:

    SELECT firstname, 
           (select count(*) from BigTable where firstname like 'a%') as count 
    from BigTable  
    where firstname like 'a%'
    

    我在数据库中使用 50k 条记录测试了这两种方法,这种方法几乎快 2 倍

    【讨论】:

    • 是的,这样做很快 - 速度与根本不执行 COUNT(*) 相同。不错:-)
    【解决方案4】:

    我觉得旧版本的 MySQL 曾经是这种情况,但这在我的测试中不起作用。

    但是根据手册,http://dev.mysql.com/doc/refman/5.1/en/group-by-functions.html#function_count 鉴于 COUNT(*) 是一个 group by 函数,并且自然地将所有行分组在一起,当没有附加 GROUP BY 语句时,我只能看到解决方案要么是多个语句,要么是一个子查询。如果可以,我建议单独运行 2 个查询,但如果不可能,请尝试:

    SELECT firstname,
        total
      FROM BigTable,
      ( SELECT COUNT(*) AS total
          FROM BigTable ) AS dummy
      WHERE firstname LIKE 'a%';
    

    【讨论】:

    • 这与我要找的很接近,尽管在第二列中,我得到了表中的记录总数,而不是与搜索匹配的总数。
    • 我在子查询中添加了“WHERE firstname LIKE 'a%'”,现在它返回了正确的响应。执行时间与 bluefeet 的答案非常相似,重复运行时约为 6.1 秒。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    • 2019-11-30
    • 2012-07-23
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多