从MySQL选择最后N行


121

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

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行?

Answers:


236

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

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

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


5
^仅供参考,我知道这篇文章是关于MySQL的,但是想建议一下,响应@DiegoDD的上述评论,忽略外部选择和别名在Postgres(9.3.5)中似乎不起作用。我收到“错误:不允许使用多个ORDER BY子句”。但是,已接受的答案确实可以在Postgres中正常工作
allenwlee 2014年

谢谢你!这个查询帮助我解决了我的问题。我一直在寻找这几个小时
艾尔沙德

1
如何通过JOINS应用此查询?
GYaN

@GYaN add加入内部子查询
谢赫·

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

如果您有一个日期字段,用于存储发送聊天的日期(和时间),或者任何每行填充有增量(按DESC排序)或非增量(按ASC排序)数据的字段,请将该字段作为第二列哪些数据应该排序。

那对我有用!!!希望对您有所帮助!!!!


7
SELECT * FROM table ORDER BY id DESC LIMIT 50

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


1
您的查询将反向返回结果(降序编号)。@newfurniturey的查询将获取最后插入的行(LIMIT按降序编号显示),最终结果将具有升序编号。
罗宾·坎特斯

1
您的解决方案将不会以正确的顺序获得结果,而是将其反向,因此需要再次订购以再次将它们以正确的顺序进行
Cobra47'5

1
但是然后您只需要执行php array_reverse()或您选择的脚本语言中的任何等效操作即可。数据库不需要执行此工作。

6
@Joe问题中没有任何内容表明正在使用脚本语言,因此这并不是一个安全的假设。
尼克·库恩斯

仅使用数据库查询即可对预期答案进行排序。
d4ryl3

-2
select * from Table ORDER BY id LIMIT 30

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


1
您能解释一下您的解决方案吗?括号中的解释似乎是代码,在代码的上方/下方放置一整个句子。谢谢
deHaar '19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.