gpt4 book ai didi

sql - 选择一行,以及它两边的行

转载 作者:行者123 更新时间:2023-11-29 12:11:32 24 4
gpt4 key购买 nike

我正在整理一个博客,其中包含实现 JSON API 的帖子。为此,当我从数据库中检索帖子时,我想包含指向下一篇和上一篇帖子的链接。对于数据库,这意味着当我从 posts 表中检索一行时,我还想检索它之前的行和之后的行。

我对 SQL(特别是 postgres)有点菜鸟。目前我有以下内容:

SELECT * 
FROM posts
WHERE id >= (
SELECT id
FROM posts
WHERE id < (
SELECT id
FROM posts
WHERE slug = 'the-slug'
)
AND published = TRUE
ORDER BY id DESC
LIMIT 1
)
AND published = TRUE
ORDER BY id ASC
LIMIT 3;

(posts 有序列 id 主键,一个 published bool 值,和一个 slug varchar)

我只能接触到中心柱的弹头。这行得通,但如果 the-slug 表示第一个发布的行,则显然会中断。这也显得很幼稚。有没有更好的方法来解决这个问题?

编辑:

我试图避免这个问题对我的问题过于具体,这样任何答案都可能对许多人更有用。但是,上面的内容很松散。考虑使用以下内容创建的表:

CREATE TABLE posts (
id SERIAL PRIMARY KEY,
slug VARCHAR(255) UNIQUE NOT NULL,
published BOOLEAN NOT NULL DEFAULT FALSE
);

栏目比较多,但应该与本题无关。给定一个 slug,我试图找到与该 slug 匹配的行以及它之前和之后的行(它们存在的地方)。我正在努力实现:

  • 如果没有 slug 匹配,则没有行。
  • 如果 slug 与帖子匹配,并且它是第一个发布的帖子...
    • 如果只发布了一篇文章,则为一行。
    • 如果发布了多个帖子,则为两行(第一行和第二行)。
  • 如果 slug 与帖子匹配,并且它是最后发布的帖子...
    • 如果只发布了一篇文章,则为一行。
    • 如果发布了不止一篇文章,则两行(倒数第二行和最后一行)。
  • 如果 slug 与帖子匹配,但它不是第一个或最后一个发布的帖子......
    • 三行(匹配行之前的行、匹配行之后的行和匹配行之后的行)。

最佳答案

这里有一个非常 hacky 的方法:

SELECT * 
FROM posts
WHERE id IN (
SELECT id
FROM posts
WHERE slug = 'the-slug'
UNION

SELECT id+1
FROM posts
WHERE slug = 'the-slug'
UNION

SELECT id-1
FROM posts
WHERE slug = 'the-slug'
)
AND published = TRUE
ORDER BY id ASC
LIMIT 3;

使用 LAG 和 LEAD 选项可能有更有效的方法。

关于sql - 选择一行,以及它两边的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32036864/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com