总行数 + 限制选择

Posted

技术标签:

【中文标题】总行数 + 限制选择【英文标题】:Total row count + select with limit 【发布时间】:2013-12-04 19:54:02 【问题描述】:

我的问题与此类似: Need a row count after SELECT statement: what's the optimal SQL approach?

但我想从查询中获取总行数,然后使用 limit 创建分页,所以我不能使用返回的行。 从一个简单的查询:

select * from res_groups

我进入了这个:

select a.*, (select count(1) from (select * from res_groups) e) total 
from (select * from res_groups) a limit 10 offset 10;

或者我可以使用简单的方法并进行两个查询:

select * from res_groups limit 10;
select count(*) from res_groups;

第一个查询是否会执行?恐怕 res_groups 的查询会被执行两次?

还有其他方法吗? ps:我用的是postgres,我知道mysql有FOUND_ROWS()

【问题讨论】:

【参考方案1】:

怎么样:

WITH  a AS (select *, count(*) over (range unbounded preceding)
         FROM resgroups)
SELECT * from a order by foo limit 10 offset 10;

现在,我认为您实际上最好将其分成两个查询,因为看起来您正在有效地进行分页。如果您首先选择 count(*),然后决定需要多少页(并可能缓存该结果),那么您后续的部分查询可以使用索引,但在这种情况下,每组 10 个都需要完整的顺序扫描.

【讨论】:

以上是关于总行数 + 限制选择的主要内容,如果未能解决你的问题,请参考以下文章

总行数 + 限制选择

计算条件下的总行数和行数

git统计代码工程总行数和细分每个代码文件行数

LINUX查看文件总行数和指定行

如何在特定模式中的所有表的选择列表中获取总行数和最大(时间戳)列

SQL Server:如何在总行数和仅包含数据的行数之间得到差异