如何在MySQL表中选择最后一行?
我正在插入数据,需要检索前一行的列值。
该表中有一个自动递增。
是的,在那里有一个auto_increment
如果您想要表中所有行中的最后一行,则现在使用MAX(id)
是正确答案! 有点像:
SELECT fields FROM table ORDER BY id DESC LIMIT 1;
id
被索引了,那么就不会出现这种情况。 - user207421请记住,关系型数据库中的表只是行的集合。而在数学中,集合是无序的集合。没有第一行或最后一行;没有上一行或下一行。
您需要先按某个字段对无序行集进行排序,然后可以按照您定义的顺序自由迭代结果集。
由于您有一个自动递增字段,我假设您希望它成为排序字段。在这种情况下,您可能需要执行以下操作:
SELECT *
FROM your_table
ORDER BY your_auto_increment_field DESC
LIMIT 1;
我们首先按照 your_auto_increment_field
(或你所命名的字段)以降序排列无序行集。然后,我们使用 LIMIT 1
限制结果集只返回第一行。
你可以将@spacepille建议的两个查询组合成一个查询,如下所示:
SELECT * FROM `table_name` WHERE id=(SELECT MAX(id) FROM `table_name`);
它应该运行得非常快,但对于INNODB表格,它比ORDER+LIMIT慢了几毫秒。
在有许多行的表上,很可能有两个查询速度更快...
SELECT @last_id := MAX(id) FROM table;
SELECT * FROM table WHERE id = @last_id;
几乎每个数据库表中都有一个自增列(通常是id)。
如果您想要该表中所有行中的最后一行,
SELECT columns FROM table ORDER BY id DESC LIMIT 1;
或者
您可以将两个查询组合成一个查询,它看起来像这样:
SELECT columns FROM table WHERE id=(SELECT MAX(id) FROM table);
这里有许多答案都在说同样的事情(按照自动增量列排序),这是可以的,前提是你有一个被索引的自动递增列。
另外需要注意的是,如果你有这样一个字段并且它是主键,那么使用“order by”和“select max(id)”不会对性能造成任何损失。主键是数据库文件中数据的排序方式(至少对于InnoDB来说),关系型数据库系统知道数据的结束位置,并且可以将“order by id + limit 1”优化为达到“max(id)”。
现在少有人走的路是没有自动递增的主键。也许主键是由3个字段组成的自然键...
但并非完全没有办法。从编程语言中,你可以首先获取行数:
SELECT Count(*) - 1 AS rowcount FROM <yourTable>;
然后在 LIMIT
子句中使用获取的数字。
SELECT * FROM orderbook2
LIMIT <number_from_rowcount>, 1
不幸的是,MySQL不允许在LIMIT
子句中使用子查询或用户变量。
SELECT * FROM orderbook2 LIMIT 1 OFFSET <number_from_rowcount - 1>
- Marcellinus使用简单: PDO::lastInsertId
如果您想获取最近添加的记录,可以添加时间戳并按照最高时间戳的相反顺序选择排序,并限制为1条。如果您想按ID排序,则按ID排序。如果您想使用刚刚添加的记录,请使用mysql_insert_id
。
LIMIT
命令中使用OFFSET
:SELECT * FROM aTable LIMIT 1 OFFSET 99
如果你的表格有100行,这段代码将返回最后一行,而不必依赖主键。
在一次查询中没有ID:
SELECT * FROM table_name LIMIT 1 OFFSET (SELECT COUNT(*) - 1 FROM table_name)
auto_increment
。我想要最近添加的一个。 - esqew