从MySQL中选择最后N行

166

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

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数据库中检索最后的N行,这些行可以进行操作并以升序排列?


我知道这个问题很久了,但请澄清一下表格的数据结构,尤其是id列。它是一个整数吗?还是一个可以排序的字符串?这一点并不完全清楚,导致了一些奇怪的回答。感谢您的澄清。 - undefined
6个回答

305

你可以通过使用子查询来完成:

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

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


5
FYI,我知道这篇文章是关于MySQL的,但是想提醒一下,在回应@DiegoDD上面的评论时,省略外部选择和别名在Postgres(9.3.5)中似乎无法正常工作。我得到一个“错误:不允许多个ORDER BY子句”。然而,接受的答案在Postgres中确实可以正常工作。 - allenwlee
谢谢!这个查询帮助我解决了我的问题。我已经搜索了好几个小时才找到它。 - Arshad
1
我该如何使用JOINS应用这个查询? - GYaN
@GYaN 在内部子查询中添加连接。 - sheikh hamza
如果没有给出ID,那么有没有办法做到这一点?就像在Oracle中,我们可以使用rownum来处理这种情况,那么在MySQL中我们该怎么办? - Aunny
在我看来,这是最棒的 SQL 特性之一。 - enapupe

22
SELECT * FROM table ORDER BY id DESC LIMIT 50

节约资源,只需进行一次查询,无需进行嵌套查询


2
您的查询将按相反顺序(降序ID)返回结果。 @newfurniturey的查询将获取最后插入的行(在降序ID上LIMIT),最终结果将具有升序ID。 - Robin Kanters
1
你的解决方案将无法按正确顺序获取结果,而是会将它们反转,因此需要另一个排序来再次按正确顺序获取它们。 - Cobra47
3
但是你可以使用php array_reverse()或者在你所选择的脚本语言中使用等效方法。数据库不需要执行这项工作。 - Joe
8
@Joe 在问题中没有任何提示表明正在使用脚本语言,因此这不是一个安全的假设。 - Nick Coons
期望的答案应该已经通过仅使用数据库查询进行了排序。 - d4ryl3
不对,你颠倒了数据 :)。 - Thư Sinh

11
SELECT * FROM table ORDER BY id DESC, datechat DESC LIMIT 50

如果您有一个日期字段,用于存储聊天发送日期(和时间),或者任何按行存储递增(order by DESC)或递减(order by ASC)数据的字段,请将其作为第二列来排序。

这是我所采用的方法!希望它能帮到您!


2

使用它从mysql检索最后的n行

选择* from tbl order by id desc limit 10;

根据N值使用limit。


1
这与三个答案中的两个以及OP的实际查询完全相同。问题不仅在于如何获取最后10行,而是如何按升序获取它们。 - Panagiotis Kanavos

0

如果有人需要这个,你可以将其更改为

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

转换为

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

-3
select * from Table ORDER BY id LIMIT 30

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


2
能否请您解释一下您的解决方案?括号中的内容似乎是代码,请在您的代码上/下方添加一个完整的句子。谢谢。 - deHaar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接