在MySQL中选择最后一行

我怎样才能SELECT在MySQL表的最后一行?

我正在INSERTing数据,我需要从上一行检索一个列值。

表中有一个auto_increment

678097 次浏览

是的,这里有一个auto_increment

如果你想要表中所有的行的最后一个,那么这最终是MAX(id)是正确答案的时候!一种:

SELECT fields FROM table ORDER BY id DESC LIMIT 1;

请记住,关系数据库中的表只是行的集合。集合在数学中是无序集合。没有第一行或最后一行;没有上一行或下一行。

您必须首先根据某些字段对您的无序行集进行排序,然后才可以按照您定义的顺序对结果集进行迭代。

既然你有一个自动递增字段,我假设你想要它作为排序字段。在这种情况下,你可能需要做以下事情:

SELECT    *
FROM      your_table
ORDER BY  your_auto_increment_field DESC
LIMIT     1;

看看我们是如何首先通过your_auto_increment_field(或你给它起的任何名字)对无序行集进行降序排序的。然后将结果集限制为LIMIT 1的第一行。

如果您想要最近添加的一个,添加一个时间戳,并按最高时间戳的倒序选择,限制1。如果你想按ID排序,就按ID排序。如果你想使用你刚刚添加的,使用mysql_insert_id

在有很多行的表上,两个查询可能更快…

SELECT @last_id := MAX(id) FROM table;


SELECT * FROM table WHERE id = @last_id;

简单地使用:PDO::lastInsertId

http://php.net/manual/en/pdo.lastinsertid.php

你可以将@spacepille建议的两个查询组合成一个查询,看起来像这样:

SELECT * FROM `table_name` WHERE id=(SELECT MAX(id) FROM `table_name`);

它的工作速度应该非常快,但在INNODB表上,它比ORDER+LIMIT慢了几分之一毫秒。

SELECT * FROM adds where id=(select max(id) from adds);

此查询用于获取表中的最后一条记录。

你可以在LIMIT命令中使用OFFSET:

SELECT * FROM aTable LIMIT 1 OFFSET 99

如果您的表有100行,则返回最后一行而不依赖于主键

几乎每个数据库表都有一个auto_increment列(通常是id)

如果你想要表中的最后一行,

SELECT columns FROM table ORDER BY id DESC LIMIT 1;

你可以将两个查询组合成一个查询,就像这样:

SELECT columns FROM table WHERE id=(SELECT MAX(id) FROM table);

这里的许多答案都是相同的(根据自动增量排序),这是可以的,前提是您有一个索引的自递增列。

另一方面,如果你有这样的字段并且它为主键,使用order byselect max(id)没有性能损失。主键是数据在数据库文件中的排序方式(至少对于InnoDB), RDBMS知道数据的结束位置,它可以优化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子句中使用子查询或用户变量

在一个查询中没有ID:

SELECT * FROM table_name LIMIT 1 OFFSET (SELECT COUNT(*) - 1 FROM table_name)