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

时间:2017-09-29 19:33:00

标签: mysql sql

我写了一个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。

1 个答案:

答案 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