2010-05-20 79 views
4

我不确定这是否是一个好问题。每行添加count()列

我有一个复杂的查询与很多的工会,搜索多个表的某个关键字(用户输入)。所有搜索到的表都与表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 

...

谢谢!

+1

这有什么错用一个单独的查询?在结果集的每一行中添加具有相同值的列相当难看。也许你可以把count作为单个请求的一部分(尽管是一个不同的查询)。 – 2010-05-20 11:22:27

+1

好吧,我不得不使用几乎相同的查询(而不是选择值我会做count(...))但是,查询是复杂的,它是包含内部连接的几个查询的联合。查询需要大约1秒钟的时间来执行,我只是觉得2秒太多了...... – Nathan 2010-05-20 12:50:21

+0

请输入密码。你现在的查询是什么样的? – 2010-05-20 13:00:23

回答

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

+0

这实际上做的窍门,谢谢! – Nathan 2010-05-22 08:17:05

4

在查询计数的通常的方法是所返回的字段组:

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

所述CNT列将包含各组,即对于每个标题中记录的数量。

+0

<撤回的评论> – 2010-05-20 11:30:47

+0

是真的,但没有什么'分组',我需要计算的总行数,而不仅仅是组的行... – Nathan 2010-05-20 12:48:45

+2

@Arsenal:我明白了......如果你想返回一个计数以及你计算的数据,那么你需要一个单独的查询。您可以将其作为子查询或加入,以相同的结果返回它,但是没有办法绕过它。 – Guffa 2010-05-20 17:26:05

-4

你根本无法做到这一点,你将不得不使用第二个查询。

+0

好吧,我担心这会是这种情况... – Nathan 2010-05-20 12:52:48

5

关于第二个查询:

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

如果你不会加入到其他表(S):

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

这增加了所有的计数记录到每一行,而不是每个组的计数 – user2378769 2016-05-12 22:42:50

+0

@ user2378769检查问题 – 2016-05-13 08:28:33

0

如果你的问题是简单地做第二(复杂)的速度/成本查询我建议你简单地选择结果集到一个散列表中,然后在返回时从那里计算行数,或者甚至更有效地使用先前结果集的rowcount,那么你甚至不需要重新计算

1

我的解决方案:

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