6

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

4 回答 4

7

您可以使用交叉连接。子查询将获取所有的计数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

于 2013-05-23T00:07:34.773 回答
3

您可以加入子查询:

SELECT firstname, ct
FROM BigTable
JOIN (SELECT COUNT(*) ct
      FROM BigTable
      WHERE firstname LIKE 'a%') x ON (1 = 1)
WHERE firstname LIKE 'a%'
于 2013-05-23T00:03:26.500 回答
2

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

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

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

于 2020-04-07T16:09:44.067 回答
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%';
于 2013-05-23T00:07:47.297 回答