代码之家  ›  专栏  ›  技术社区  ›  Jans Rautenbach

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

  •  0
  • Jans Rautenbach  · 技术社区  · 7 年前

    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
    

    它对表进行排序,然后创建一列,其中包含每行的行号。然后,它选择具有特定posted的记录的行号,然后从重复表中选择行号更大的记录。

    注意:我意识到我可以跳过整个行数,只使用posted,因为它是增量的,但如果我决定不再希望我的pk是整数,我想保留我的选项。

    注2:这是MySQL。

    1 回复  |  直到 7 年前
        1
  •  1
  •   ulferts    7 年前

    我假设有一些列可以用来确定记录是在postID 201的记录之前还是之后。通过扫描你的查询,我想说你有一个 timestamp

    如果是这种情况,可以在表上使用自连接 some_table 比较两个表实例的列。但是,一组列被缩减为记录的时间戳,并带有 postID = 201 .

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

    结果集现在只包含时间戳大于postID 201的记录,我们将postID 201限制为仅包含25个条目。为了直接在posted 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