出于分页目的,我需要使用LIMIT
和OFFSET
子句运行查询。但是我还需要计算不带LIMIT
andOFFSET
子句的查询将返回的行数。
我要跑步:
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。 当我的数据库中有预定数量的项目时,这种方式可以运行。但这不是很好。仅当有更多项目时才需