从MySQL中选择最后N行

nan*_*ash 108 mysql database

我想在名为id的列中选择MySQL数据库的最后50行,这是主键.目标是行应该被分类IDASC秩序,这就是为什么这个查询不工作

SELECT 
    *
FROM
    `table`
ORDER BY id DESC
LIMIT 50;
Run Code Online (Sandbox Code Playgroud)

另外值得注意的是行可以被操作(删除),这就是为什么后续查询也不起作用的原因

SELECT 
    *
FROM
    `table`
WHERE
    id > ((SELECT 
            MAX(id)
        FROM
            chat) - 50)
ORDER BY id ASC;
Run Code Online (Sandbox Code Playgroud)

问题:如何从MySQL数据库中检索可以操作并处于ASC顺序的最后N行?

new*_*rey 208

您可以使用子查询执行此操作:

SELECT * FROM (
    SELECT * FROM table ORDER BY id DESC LIMIT 50
) sub
ORDER BY id ASC
Run Code Online (Sandbox Code Playgroud)

这将从中选择最后 50行table,然后按升序排序.

  • ^仅供参考,我知道这篇文章是关于MySQL的,但是我想建议回应@ DiegoDD上面的评论,省略外部选择和别名似乎在Postgres(9.3.5)中不起作用.我得到一个'错误:不允许多个ORDER BY子句'.然而,接受的答案确实在Postgres中有效 (5认同)

小智 15

SELECT * FROM table ORDER BY id DESC LIMIT 50
Run Code Online (Sandbox Code Playgroud)

节省资源 一键查询,无需嵌套查询

  • @Joe 问题中没有任何内容表明正在使用脚本语言,因此这不是一个安全的假设。 (7认同)
  • 但是,您只需执行 php array_reverse() 或您选择的脚本语言中的任何等效操作即可。数据库不需要做这项工作。 (3认同)
  • 您的查询将以相反的方式返回结果(ID 降序)。@newfurniturey 的查询将获取最后插入的行(按降序 id 限制),最终结果将具有升序 id。 (2认同)

aid*_*ous 9

SELECT * FROM table ORDER BY id DESC,datechat desc LIMIT 50
Run Code Online (Sandbox Code Playgroud)

如果您有一个日期字段,用于存储发送聊天的日期(和时间),或者任何以递增方式填写的字段(按DESC排序)或desinscrementally(按ASC排序)每行数据将其作为第二列哪些数据应该是订购的.

这对我有用!!!! 希望它会有所帮助!!!!