我编写了一个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成为整数,我想保留我的选项。
Note2:我是MySQL。
发布于 2017-09-29 21:01:29
我假设有一些列可以用来确定记录是在postID 201记录之前还是之后。通过扫描查询,我可以说您有一个timestamp列,您希望通过该列来订购(忽略post ID的增量性质)。
如果是这样的话,就可以在表some_table上使用一个自联接(为了简单起见),在这里比较两个表实例的timestamp列。但是有一组列,被简化为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 25https://stackoverflow.com/questions/46495773
复制相似问题