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