在不改变表结构的情况下,选择表中最后n行的最有效方法是什么?

时间:2008-09-22 23:06:05

标签: mysql sql

使用mySQL选择表中最后n行的最有效方法是什么?该表包含数百万行,并且在任何给定时间我都不知道该表有多大(它在不断增长)。该表有一个自动递增的列,并用作每行的唯一标识符。

8 个答案:

答案 0 :(得分:46)

SELECT * FROM table_name ORDER BY auto_incremented_id DESC LIMIT n

答案 1 :(得分:16)

实际上,按顺序获取最后n行的正确方法是使用子查询:

(SELECT id, title, description FROM my_table ORDER BY id DESC LIMIT 5) 
ORDER BY tbl.id ASC

这种方式是我所知道的唯一能以正确的顺序返回它们的方式。接受的答案实际上是“从按降序ID 排序的集合中选择前5行”的解决方案,但这很可能是您需要的。

答案 2 :(得分:4)

也许按唯一ID降序排序:

SELECT * FROM table ORDER BY id DESC LIMIT n

唯一的问题是你可能想要以不同的顺序选择,这个问题让我必须通过计算行数来选择最后一行,然后使用LIMIT选择它们,但显然这可能不是在你的情况下一个很好的解决方案。

答案 3 :(得分:4)

(类似于#34; marco"答案),
我最喜欢的是MySQL的max() - 函数,在一个简单的单行中,但还有其他方法可以肯定:

SELECT whatever FROM mytable WHERE id > (SELECT max(id)-10 FROM mytable);

...你得到"最后一个减去10",通常是该表的最后10个条目。

这是一个简短的方法,以避免错误1111("无效使用组功能"),不仅如果有auto_increment-row(此处为id)。
max() - 函数可以多种方式使用。

答案 4 :(得分:2)

使用ORDER BY按DESC顺序按标识符列排序,并使用LIMIT指定所需的结果数。

答案 5 :(得分:2)

你可能还想添加一个降序索引(或者在mysql中调用它们的任何内容),以便在你经常要做的事情时快速选择。

答案 6 :(得分:1)

当你拥有大表时,这要快得多,因为你不必订购整个表。 您只需将id用作唯一的行标识符。 当您在某些列中存在大量数据(例如图像(blob))时,这也更有效。在这种情况下,订单可能非常耗费时间和数据。

select * 
from TableName 
where id > ((select max(id) from TableName)-(NumberOfRowsYouWant+1)) 
order by id desc|asc

唯一的问题是如果删除所需间隔中的行。在这种情况下,你不会得到真正的“NumberOfRowsYouWant”。

当您需要在多个网页中向后显示表格时,您也可以轻松地使用此选项为每页选择n行,只需将(NumberOfRowsYouWant + 1)乘以页码即可。

答案 7 :(得分:0)

您可以根据需要更改表名和列名。如果你想显示最后10行,那么根据你的要求把n = 10,或n = 20,或n = 30 ......等。

选择*来自 (从员工中选择* 按emp_id desc limit n)排序 emp_id asc的订单;

相关问题