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