【问题标题】:How to select 'previous' and 'next' records in SQL?如何在 SQL 中选择“上一个”和“下一个”记录?
【发布时间】:2011-02-17 19:43:40
【问题描述】:

我正在我的网站上构建一个博客文章详细信息页面,该页面将显示“上一个”和“下一个”链接,类似于打字板博客文章的工作方式.请参见下面的示例。

我想知道是否有一种方法可以查询数据库,它可以完成如下图所示的操作,它选择“当前”记录(黄色)进行显示,但也选择下一条和上一条记录(绿色)按发布日期排序。

另外,为澄清起见,我正在使用的数据库表具有唯一的发布日期。抱歉,示例图片显示了具有相同 PublishDate 的多条记录。

【问题讨论】:

  • @Drew,你是对的。我的问题是重复的。我真的很高兴你发现了!我不能,所以我问了上面的问题。我刚刚投票决定关闭这个答案。
  • 没问题。我正在尝试做同样的事情,尽管通过实体框架 (stackoverflow.com/questions/5382023/…)。将这些问题联系在一起有助于人们评估一系列选项。

标签: sql sql-server pagination


【解决方案1】:

你没有。 SQL 没有上一个、下一个概念。您基本上要求在您已经拥有的查询之后的有序查询(例如按日期)中的下一个前 1 个。这意味着您需要有/强加一个订单(按订单)进行过滤。

【讨论】:

  • 在问题中我说我已经按照唯一的 PublishDate 对记录进行了排序。我想知道是否可以进行 1 次往返 SQL 服务器以按 ID 选择记录以及排序时的“之前”和“之后”记录。
  • @jessegavin,如果您使用 UNION 连接具有相同列的两个查询,您可以在一次访问数据库中完成此操作。
【解决方案2】:

您需要一种排序帖子的方法。如果你有,那么你可以在 SQL Server 2005+ 中执行以下操作,在其中传入你想要的项目编号:

With OrderedPosts As
    (
    Select ...
        , ROW_NUMBER() OVER ( ORDER BY PublishDate ) As ItemRank
    From ..
    Where ...
    )
Select
From OrderedPosts
Where ItemRank = @ItemNumber

在站点代码中,您需要跟踪您当前所在的号码,然后减一并重新查询以获取上一个或加一并重新查询以获取下一个。

如果您希望在单个查询中包含下一个和上一个以及当前,那么您可以执行以下操作:

With OrderedPosts As
    (
    Select ...
        , ROW_NUMBER() OVER ( ORDER BY PublishDate ) As ItemRank
    From ..
    Where ...
    )
Select
From OrderedPosts
Where ItemRank Between (@ItemNumber - 1) And (@ItemNumber + 1)

【讨论】:

  • 我认为这个例子适用于我已经有了“索引”概念的场景(例如 100 中的第 5 位)。但是在我的情况下,我想传递给查询的标识符是一个 guid。 - 例如,如果页面 url 是 abc.com/post.aspx?id={guid},然后假设用户从 Google 结果到达该页面,那么我将如何找到 @ItemNumber?
  • @jessegavin - 您将必须强加一个顺序/顺序,以便有一个前后的概念。如果您允许用户根据某个 id 访问页面,则您必须有一种方法来确定该项目在序列中的位置,并且您必须使用类似 ROW_NUMBER() 之类的东西自己强加该序列。谷歌不允许这样做。如果用户搜索“Foo”,则无法从单个链接确定给定链接将出现在页面 X 上。您必须手动确定,因为 Google 只是使用结果计数和起始编号来显示其结果。
  • 澄清一下,我并不是说我会依赖谷歌来管理记录索引或任何东西。我提到了谷歌作为一个可能的引荐来源,用户最终可能会通过它访问我网站中的特定页面。 - 我想我的问题在于我不想首先运行查询来确定给定 guid 的 @ItemNumber,以便我可以使用您上面提供的语法运行第二个查询。 - 谢谢你的回答。 +1
【解决方案3】:

根据 Thomas 的回答,您可以执行以下操作。@Id 是您拥有唯一帖子的 GUID。

With OrderedPosts As
    (
    Select Id
        , Title
        , PublishDate
        , ROW_NUMBER() OVER ( ORDER BY PublishDate ) As ItemRank
    From Posts
    )
Select top 3 *
From OrderedPosts
Where ItemRank > (select ItemRank from OrderedPosts where Id = @Id) - 2

【讨论】:

    【解决方案4】:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-05
      • 2014-03-21
      • 2021-04-06
      • 1970-01-01
      • 1970-01-01
      • 2012-08-27
      • 1970-01-01
      相关资源
      最近更新 更多