【发布时间】:2017-01-31 15:52:53
【问题描述】:
使用 mySQL 选择表中最后 n 行的最有效方法是什么?该表包含数百万行,并且在任何给定时间我都不知道该表有多大(它在不断增长)。该表确实有一列会自动递增并用作每一行的唯一标识符。
【问题讨论】:
使用 mySQL 选择表中最后 n 行的最有效方法是什么?该表包含数百万行,并且在任何给定时间我都不知道该表有多大(它在不断增长)。该表确实有一列会自动递增并用作每一行的唯一标识符。
【问题讨论】:
SELECT * FROM table_name ORDER BY auto_incremented_id DESC LIMIT n
【讨论】:
实际上按顺序获取最后 n 行的正确方法是使用子查询:
(SELECT id, title, description FROM my_table ORDER BY id DESC LIMIT 5)
ORDER BY tbl.id ASC
因为我知道只有这种方式才能以正确的顺序返回它们。接受的答案实际上是“从按 ID 降序排序的集合中选择前 5 行”的解决方案,但这很可能是您需要的。
【讨论】:
(SELECT * FROM table ORDER BY id DESC LIMIT 50) ORDER BY id ASC; 尽管读起来可能有点混乱。
(类似于“marco”的回答,)
我最喜欢的也是 MySQL 的 max()-function,在一个简单的 one-liner 中,但还有其他方法可以确定:
SELECT whatever FROM mytable WHERE id > (SELECT max(id)-10 FROM mytable);
...你会得到“last id minus 10”,通常是该表的最后 10 个条目。
这是一种简短的方法,不仅可以避免出现错误 1111(“无效使用组函数”),而且不仅存在 auto_increment-row(此处为 id)。
max() 函数有多种使用方式。
【讨论】:
也许按唯一 id 降序排列:
SELECT * FROM table ORDER BY id DESC LIMIT n
唯一的问题是您可能希望以不同的顺序进行选择,而这个问题使我不得不通过计算行数来选择最后一行,然后使用 LIMIT 选择它们,但显然这可能不是在您的情况下是一个很好的解决方案。
【讨论】:
使用 ORDER BY 以 DESC 顺序按标识符列排序,并使用 LIMIT 指定所需的结果数。
【讨论】:
如果你经常要做的事情,你可能还想添加一个降序索引(或在 mysql 中调用的任何东西)以加快选择速度。
【讨论】:
当您有大桌子时,这会快很多,因为您不必订购整张桌子。 您只需使用 id 作为唯一的行标识符。 当您在某些列中有大量数据作为图像(例如 blob)时,这也更有效。在这种情况下,排序可能非常耗时且耗费数据。
select *
from TableName
where id > ((select max(id) from TableName)-(NumberOfRowsYouWant+1))
order by id desc|asc
唯一的问题是如果您在所需的时间间隔内删除行。在这种情况下,您不会得到真正的“NumberOfRowsYouWant”。
当您需要在多个网页中向后显示表格时,您还可以轻松地使用它为每个页面选择 n 行,只需将 (NumberOfRowsYouWant+1) 乘以页码即可。
【讨论】:
您可以根据需要更改表名和列名。如果您想显示最后 10 行,则根据您的要求输入 n=10,或 n=20,或 n=30 ...等。
选择 * 来自 (从员工中选择 * 按 emp_id desc limit n) 排序 emp_id asc 的订单;
【讨论】: