从 MySQL 中选择最后 N 行

Posted

技术标签:

【中文标题】从 MySQL 中选择最后 N 行【英文标题】:Select last N rows from MySQL 【发布时间】:2012-08-20 23:48:38 【问题描述】:

我想从 mysql 数据库中选择名为 id 的列中的最后 50 行,该列是 主键。目标是行应该按照 ASC 顺序按 id 排序,这就是该查询不起作用的原因

SELECT 
    *
FROM
    `table`
ORDER BY id DESC
LIMIT 50;

同样值得注意的是,行可以被操纵(删除),这就是为什么下面的查询也不起作用

SELECT 
    *
FROM
    `table`
WHERE
    id > ((SELECT 
            MAX(id)
        FROM
            chat) - 50)
ORDER BY id ASC;

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

【问题讨论】:

【参考方案1】:
select * from Table ORDER BY id LIMIT 30

注意事项: * id 应该是唯一的。 * 可以通过替换查询中的30来控制返回的行数

【讨论】:

您能解释一下您的解决方案吗?括号中的解释似乎是代码,在您的代码上方/下方放置一个完整的句子。谢谢【参考方案2】:
SELECT * FROM table ORDER BY id DESC,datechat desc LIMIT 50

如果您有一个日期字段存储发送聊天的日期(和时间),或者任何字段以递增方式(按 DESC 排序)或递减方式(按 ASC 排序)数据填充,则将其作为数据应按顺序排列的第二列。

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

【讨论】:

【参考方案3】:
SELECT * FROM table ORDER BY id DESC LIMIT 50

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

【讨论】:

您的查询将反向返回结果(降序 id)。 @newfurniturey 的查询将获取最后插入的行(LIMITing on 降序 id),最终结果将具有升序 id。 您的解决方案不会以正确的顺序获得结果,而是会使它们反转,因此需要另一个顺序才能再次以正确的顺序获得结果 但是您只需执行 php array_reverse() 或您选择的脚本语言中的任何等效项。数据库不需要做这项工作。 @Joe 问题中没有任何内容表明正在使用脚本语言,因此这不是一个安全的假设。 预期的答案应该已经使用数据库查询进行了排序。【参考方案4】:

您可以使用子查询来做到这一点:

SELECT * FROM (
    SELECT * FROM table ORDER BY id DESC LIMIT 50
) sub
ORDER BY id ASC

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

【讨论】:

^ 仅供参考,我知道这篇文章是关于 MySQL 的,但我想建议,作为对 @DiegoDD 上述评论的回应,省略外部选择和别名似乎在 Postgres (9.3.5) 中不起作用.我收到“错误:不允许使用多个 ORDER BY 子句”。然而,接受的答案确实在 Postgres 中按预期工作 谢谢!这个查询帮助我解决了我的问题。我已经找了好几个小时了 如何使用 JOINS 应用此查询? @GYaN 在内部子查询中添加连接 如果没有给出 id 怎么办,那么有没有办法做到这一点?就像在 oracle 中一样,我们可以在这种情况下使用 rownum,我们可以在 MySQL 中做什么?

以上是关于从 MySQL 中选择最后 N 行的主要内容,如果未能解决你的问题,请参考以下文章

如何从mysql中的表中选择N条记录

如何使用 MySQL 选择最后一行匹配条件的父/子关系的最后一个子行

MySQL:选择 N 行,但在一列中只有唯一值

查找当前行是不是是要从数据库中选择的最后一行

从mysql表中选择特定行

MYSQL:使用字母数字 ID 在特定值之后选择接下来的 100 行