我不确定这是否是一个好问题。
我有很多联盟的复杂查询,可以在多个表中搜索某个关键字(用户输入)。搜索到的所有表都与表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
...
谢谢!
答案 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)
你根本不能这样做,你将不得不使用第二个查询。