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

计算MySQL中的行数以及实际的行内容,mysql,count,rows,Mysql,Count,Rows,MySQL中有没有一种方法可以执行一条SQL语句,返回所选行以及结果行的计数 我可以这样做: SELECT COUNT(*) FROM BigTable WHERE firstname LIKE 'a%'; 这给了我一个带有计数的结果行(37781)。我可以得到如下实际行数据: SELECT firstname FROM BigTable WHERE firstname LIKE 'a%'; SELECT firstname, COUNT(*) FROM BigTable WHERE fir

MySQL中有没有一种方法可以执行一条SQL语句,返回所选行以及结果行的计数

我可以这样做:

SELECT COUNT(*) FROM BigTable WHERE firstname LIKE 'a%';
这给了我一个带有计数的结果行(37781)。我可以得到如下实际行数据:

SELECT firstname FROM BigTable WHERE firstname LIKE 'a%';
SELECT firstname, COUNT(*) FROM BigTable WHERE firstname LIKE 'a%';
显示实际的37781行。但当我尝试将它们结合起来时,就像这样:

SELECT firstname FROM BigTable WHERE firstname LIKE 'a%';
SELECT firstname, COUNT(*) FROM BigTable WHERE firstname LIKE 'a%';
我得到一行,第一行与查询匹配,记录总数与查询匹配


我想看到的是两列37781行。第一列应包含每行的名字,第二列应包含每行的数字“37781”。有没有办法编写查询来完成此任务?

您可以使用子查询进行连接:

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

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

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

请参见

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

但根据手册,鉴于COUNT(*)是一个按函数分组的函数,并且自然地将所有行分组在一起,当没有附加group by语句时,我只能看到解决方案是使用多个语句或子查询。如果可以,我建议分别运行这两个查询,但如果不可能,请尝试:

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

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

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

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

谢谢,效果非常好。Barmar的答案也很有效,但这比另一种方法(约6.5秒)要快一些(约5.75秒)。我没听说过。谢谢你的提示。@BrianMoore SQL Fiddle是由StackOverflow用户编写的!:)谢谢你,巴尔马!我测试了它,它完全符合我的要求。这接近我要查找的内容,尽管在第二列中,我得到了表中记录的总数,而不是与搜索匹配的总数。我在子查询中添加了“WHERE firstname LIKE'a%”,现在它返回了正确的响应。执行时间与BlueFoot的答案非常相似,重复运行时大约为6.1秒。非常感谢。是的,这样做很快-速度与根本不做计数(*)是一样的。很好:-)