【问题标题】:How to select rows with id just larger than x in descending order如何按降序选择 id 仅大于 x 的行
【发布时间】:2016-09-05 11:14:49
【问题描述】:

我想选择 5 个比 id 15 更新的帖子,仅使用 SQL 以降序排列。这个查询有效,但我想只使用一个SELECT 来做到这一点。有什么想法吗?

SELECT * FROM (
            SELECT * FROM posts WHERE id > 15 ORDER BY id ASC LIMIT 5
            ) as reverse_ordered ORDER BY id DESC

下一个查询不起作用,因为我想要 id 为 20-16 的帖子,但这个查询会返回最新的帖子(例如 100-96,如果有 100 个帖子)

SELECT * FROM posts WHERE id > 15 ORDER BY id DESC LIMIT 5

id 之间的差距是可能的,上面的数字只是一个例子。

【问题讨论】:

  • 我认为不可能。为什么你希望它是一个单一的查询?为了简单还是什么?
  • 简单和好奇。
  • 好的,让我们等待一些有趣的答案
  • 如果您的 id 没有间隙(您说要 20-16),您可以使用select * from posts where id < 21 order by id desc limit 5。否则你需要你的双重select
  • 是的,遗憾的是可能存在差距:(

标签: sql postgresql pagination


【解决方案1】:

大多数人不会认为这更简单。但是,它不使用子查询:

select unnest( (array_agg(p.id order by p.id asc)::int[])[1:5]) as id
from posts p
where p.id >= 15
order by id desc;

带有子查询的方法在性能方面应该更好。

【讨论】:

  • 到目前为止最好的答案,虽然我必须承认我希望有一些不同的东西:)
  • 在没有Sub-Query的情况下SQL Server中是否有可能实现这样的魔法
【解决方案2】:

郑重声明,当id 上的索引支持时,您拥有的查询是最佳的,并且比任何替代方法都快得多。它解析为单个索引扫描。第二类的成本可以忽略不计。不知道你为什么想要一个SELECT,但这可能是个误会。

作为概念证明,当我们进行这场疯狂的追逐时:您要求SELECT *,而不是SELECT id

SELECT (unnest((array_agg(p ORDER BY p.id))[1:5])).*
FROM   posts p
WHERE  p.id > 15
ORDER  BY id DESC;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多