我写了一个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。
答案 0 :(得分:1)
我假设有一些列用于确定记录是在postID 201的记录之前还是之后。通过扫描您的查询,我说您有timestamp
列,你想订购(忽略帖子ID的增量性质)。
如果是这种情况,可以在表some_table
上使用自联接(为简单起见),其中比较两个表实例的timestamp
列。但是一组colums被缩减到记录的时间戳postID = 201
。
换句话说,我们的连接条件是表格的所有记录,其时间戳大于具有postID 201&的记录的时间戳。这是OP指定的条件。
结果集现在只包含时间戳大于postID 201的记录,我们将其限制为仅包含25个条目。为了在postID 201之后直接获取,我们再次按timestamp
订购。
查询可能如下所示:
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