计算MySQL中的行以及实际的行内容

时间:2013-05-22 23:51:35

标签: mysql count rows

在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”。有没有办法编写查询来完成这个?

4 个答案:

答案 0 :(得分:6)

您可以使用CROSS JOIN。子查询将获得所有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

答案 1 :(得分:2)

您可以加入子查询:

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

答案 2 :(得分:2)

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

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

我用数据库中的5万条记录测试了这两种方法,这种方法快了 2倍

答案 3 :(得分:1)

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

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

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