当前位置: 首页 > 面试题库 >

使用LIMIT / OFFSET运行查询,并获得总行数

赵高雅
2023-03-14
问题内容

出于分页目的,我需要使用LIMITOFFSET子句运行查询。但是我还需要计算不带LIMITandOFFSET子句的查询将返回的行数。

我要跑步:

SELECT * FROM table WHERE /* whatever */ ORDER BY col1 LIMIT ? OFFSET ?

和:

SELECT COUNT(*) FROM table WHERE /* whatever */

同时。有没有办法做到这一点,特别是让Postgres优化它的方法,使其比单独运行它们都快?


问题答案:

是的。 具有简单的窗口功能:

SELECT *, **count(*) OVER() AS full_count**
FROM   tbl
WHERE  /* whatever */
ORDER  BY col1
OFFSET ?
LIMIT  ?

请注意,成本将比没有总数大得多,但通常仍比两个单独的查询便宜。Postgres必须实际上以任何一种方式对 所有行 进行 计数
,这取决于符合条件的行的总数而产生了费用。

但是 ,正如Dani所指出的那样,当OFFSET至少等于从基本查询返回的行数时,将不返回任何行。所以我们也没有得到full_count

如果不可接受,则 始终返回全部计数 的可能 解决方法 是CTE和OUTER JOIN

WITH cte AS (
   SELECT *
   FROM   tbl
   WHERE  /* whatever */
   )
SELECT *
FROM  (
   TABLE  cte
   ORDER  BY col1
   LIMIT  ?
   OFFSET ?
   ) sub
RIGHT  JOIN (SELECT count(*) FROM cte) c(full_count) ON true;

如果行太大,full_count则会得到一行NULL值,并附加OFFSET。否则,它会像第一个查询一样附加到每一行。

如果具有所有NULL值的行是可能的有效结果,则必须检查offset >= full_count以消除空行的来源的歧义。

这仍然只执行一次基本查询。但这会增加查询的开销,并且只有在比重复进行基本查询的次数少的情况下才需要付费。

如果支持最终排序顺序的索引可用,则可能需要将其包括ORDER BY在CTE中(冗余)。



 类似资料:
  • 问题内容: 我正在使用Codeigniter执行分页功能,但我认为这通常适用于PHP / mySQL编码。 我正在使用offset和limit检索目录列表,具体取决于每页要多少结果。但是要知道所需的总页数,我需要知道(结果总数)/(限制)。现在,我正在考虑第二次运行SQL查询,然后计算所需的行数,但不使用LIMIT。但是我认为这似乎是在浪费计算资源。 有没有更好的方法?谢谢! 编辑:我的SQL查询

  • 问题内容: 我正在开发Java Web服务,当从IBM中型机(AS400)上的DB2数据库中获取大数据集时,允许分页。 例如; 如果数据集中有10000条记录,我想一次以1000个块的形式获取它们。 我发现这篇文章解释说我可以使用LIMIT和OFFSET。但是我需要将变量设置为。 现在,我一直在谷歌搜索,看到您可以使用来设置此变量。但是我无法找出在哪里键入此命令? 我正在Windows机器上进行开

  • 问题内容: 我想知道是否有一种方法可以完成: 通过使用和像这样: 我可以 使用 LIMIT和OFFSET 编写SQL语句,但仍然得到ALL结果吗? 当然我可以使用一条语句,但我尽可能避免使用它 问题答案: 从MySQL文档: 要检索从某个偏移量到结果集结尾的所有行,可以为第二个参数使用较大的数字。该语句检索从第96行到最后一行的所有行: 选择* FROM tbl LIMIT 95,18446744

  • 问题内容: 我正在尝试创建一个简单的图像库,每页显示16张图像。我使用LIMIT 16在页面上显示正确的数量,但是如果行数超过16,我想在底部显示链接,以允许用户导航到下一页。 我知道我可以通过删除限制并简单地使用循环来显示前16个项目来达到期望的结果,但是这样效率很低。显然,COUNTING行数总是= 16。 有人可以建议一种更有效的方法吗? 谢谢 问题答案: 除了要获取其他人都提到的计数的单独

  • 问题内容: 我有一个与此类似的表: 我想先更换2次出现的用用,然后4下出现,使生成的表如下所示: 当然,所讨论的表要大得多,因此出现的次数也会更多,因此手动编辑不是解决方案。 我想做这样的事情: 但是不幸的是,MySQL似乎在UPDATE查询中不支持OFFSET …有什么办法吗? 问题答案: 尝试这个: 然后

  • 问题内容: 我有一些限制数据以每页仅显示4个项目的代码。我使用的列大约有20到30个项目,因此我需要将这些项目分散在各个页面上。 在第一页上,我有: 您会在页面底部注意到我的定位标记,其中列出了第二个页面“ itempage2.php”。在项目页面2中,我具有相同的代码,除了我的select语句列出了偏移量4。 当我的数据库中有预定数量的项目时,这种方式可以运行。但这不是很好。仅当有更多项目时才需