gpt4 book ai didi

mysql - 获取特定行 SQL 之后的所有记录的最简单方法

转载 作者:行者123 更新时间:2023-11-29 10:35:28 26 4
gpt4 key购买 nike

我编写了一个 SQL 查询(如下),该查询选择 postID 201 的记录之后的接下来 25 条记录。(您不必阅读它)

SELECT
title,
content,
table_with_rn.userID,
table_with_rn.username,
postID,
post_timestamp
FROM
(
SELECT
title,
content,
posts.userID,
users.username,
postID,
post_timestamp,
@rownum := @rownum + 1 AS row_number2
FROM
(
posts
INNER JOIN users ON posts.userID = users.userID
)
CROSS JOIN(
SELECT
@rownum := 0
) AS r
ORDER BY
post_timestamp
DESC
) AS table_with_rn
WHERE
row_number2 >(
SELECT
row_number
FROM
(
SELECT
postID,
@rownum := @rownum + 1 AS row_number
FROM
(
posts
INNER JOIN users ON posts.userID = users.userID
)
CROSS JOIN(
SELECT
@rownum := 0
) AS r
ORDER BY
post_timestamp
DESC
) AS twn
WHERE
postID = 201
)
LIMIT 25

它对表进行排序,然后创建一个列来保存每行的行号。然后,它选择具有特定 postID 的记录的行号,然后从重复表中选择具有更大行号的记录。

这个查询工作正常,但对于听起来相当简单的任务来说似乎非常复杂。有更好/更有效/更简单的方法吗?

注意:我意识到我可以跳过整个 row_number 事情并只使用 postID,因为它是增量的,但如果我决定不再希望我的 pk 成为整数,我想保持我的选项开放.

注2:这是MySQL。

最佳答案

我假设有一些列可以用来确定记录是在 postID 201 的记录之前还是之后。通过扫描您的查询,我会说您有一个 timestamp 列您想要订购的内容(忽略帖子 ID 的增量性质)。

如果是这种情况,可以在表 some_table 上使用自联接(为了简单起见),其中比较两个表实例的 timestamp 列。但是一组列被简化为带有 postID = 201 的记录的时间戳。

换句话说,我们的连接条件是“表中所有时间戳大于postID 201的记录的记录”,这是指定的条件OP。

结果集现在仅包含时间戳大于 postID 201 的记录,我们限制为仅包含 25 个条目。为了直接获取 postID 201 之后的内容,我们再次按时间戳排序。

查询可能如下所示:

SELECT 
larger.*
FROM
some_table smaller
JOIN
some_table larger
ON
smaller.timestamp < larger.timestamp
AND smaller.postID = 201
ORDER BY larger.timestamp ASC
LIMIT 25

关于mysql - 获取特定行 SQL 之后的所有记录的最简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46495773/

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