在每一行上添加count()列

时间:2010-05-20 11:17:15

标签: sql mysql

我不确定这是否是一个好问题。

我有很多联盟的复杂查询,可以在多个表中搜索某个关键字(用户输入)。搜索到的所有表都与表book相关。

使用LIMIT对结果集进行分页,因此总会有最多10个结果被撤消。

我希望结果集中有一个额外的列,显示找到的结果总量。 我不想使用单独的查询来执行此操作。是否可以在结果集中添加count()列来计算找到的每个结果?

输出看起来像这样:

ID    Title    Author    Count(...)  
1     book_1   auth_1      23  
2     book_2   auth_2      23  
4     book_4   auth_..     23  

...

谢谢!

7 个答案:

答案 0 :(得分:4)

查询中常用的计数方法是对返回的字段进行分组:

select ID, Title, Author, count(*) as Cnt
from ...
group by ID, Title, Author
order by Title
limit 1, 10

Cnt列将包含每组中的记录数,即每个标题。

答案 1 :(得分:4)

关于第二个查询:

select tbl.id, tbl.title, tbl.author, x.cnt
from tbl
cross join (select count(*) as cnt from tbl) as x

如果您不加入其他表:

select tbl.id, tbl.title, tbl.author, x.cnt
from tbl, (select count(*) as cnt from tbl) as x

答案 2 :(得分:4)

这不会将计数添加到每一行,但是在不运行第二个查询的情况下获取总计数的一种方法是使用SQL_CALC_FOUND_ROWS选项运行第一个查询,然后选择FOUND_ROWS()。如果您想知道有多少总结果,这有时很有用,这样您就可以计算页数。

示例:

select SQL_CALC_FOUND_ROWS ID, Title, Author
from yourtable
limit 0, 10;
SELECT FOUND_ROWS();

从手册中: http://dev.mysql.com/doc/refman/5.1/en/information-functions.html#function_found-rows

答案 3 :(得分:1)

我的解决方案:

SELECT COUNT(1) over(partition BY text) totalRecordNumber
  FROM (SELECT 'a' text, id_consult_req
          FROM consult_req cr);

答案 4 :(得分:0)

如果您的问题只是执行第二个(复杂)查询的速度/成本,我建议您只需将结果集选择到哈希表中,然后在返回时从那里计算行数,或者甚至更有效地使用rowcount在之前的结果集中,您甚至不必重新计算

答案 5 :(得分:0)

这将在每行上添加总数:

select count(*) over (order by (select 1)) as Cnt,*
from yourtable

答案 6 :(得分:-4)

你根本不能这样做,你将不得不使用第二个查询。