选择MySQL中的最后一行

esq*_*qew 162 mysql

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

我是INSERT数据,我需要从上一行检索列值.

auto_increment桌子上有一个.

Pek*_*ica 356

是的,那里有一个auto_increment

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

SELECT fields FROM table ORDER BY id DESC LIMIT 1;
Run Code Online (Sandbox Code Playgroud)

  • 如果它需要排序数百万行,我担心这会变慢,不是吗? (11认同)
  • 我刚刚运行了超过 2000 万行,而且速度非常快。我认为处理这个查询有某种特殊情况。(编辑:MySQL 5.7,InnoDB 引擎) (3认同)
  • @Slawa如果索引`id`则不行。 (2认同)

Dan*_*llo 29

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

您必须首先按某些字段对无序行进行排序,然后按照您定义的顺序自由迭代结果集.

由于您有一个自动递增字段,我假设您希望它是排序字段.在这种情况下,您可能希望执行以下操作:

SELECT    *
FROM      your_table
ORDER BY  your_auto_increment_field DESC
LIMIT     1;
Run Code Online (Sandbox Code Playgroud)

看看我们是如何your_auto_increment_field按降序排序(或任何你调用的)无序行的排序.然后我们将结果集限制为第一行LIMIT 1.


小智 24

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

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

SELECT * FROM table WHERE id = @last_id;
Run Code Online (Sandbox Code Playgroud)


vzr*_*vzr 17

您可以将@spacepille建议的两个查询组合成单个查询,如下所示:

SELECT * FROM `table_name` WHERE id=(SELECT MAX(id) FROM `table_name`);
Run Code Online (Sandbox Code Playgroud)

它应该快速工作,但在INNODB表上,它比ORDER + LIMIT慢几分之一.

  • 只是为了清除这里的空气 vzr 是正确的。'Jun 14' 意味着 2016 年 6 月 14 日,@karthikeyan 也只是成为会员两个月。 (2认同)

mac*_*Jun 7

简单地使用: PDO::lastInsertId

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

  • 对.大多数不错的MySQL接口库都有专门的方法,但这个问题没有标记PHP,而是一般的MySQL语法. (2认同)

Ebo*_*ike 5

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


San*_*mal 5

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

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

SELECT columns FROM table ORDER BY id DESC LIMIT 1;
Run Code Online (Sandbox Code Playgroud)

或者

您可以将两个查询合并为一个查询,如下所示:

SELECT columns FROM table WHERE id=(SELECT MAX(id) FROM table);
Run Code Online (Sandbox Code Playgroud)


Ili*_*row 5

这里的许多答案都说相同的(按自动增量排序),这没问题,前提是您有一个已编入索引的自动增量列。

附带说明一下,如果您有这样的字段并且它主键,那么使用order byvs不会有性能损失select max(id)。主键是数据在数据库文件中的排序方式(至少对于 InnoDB),RDBMS 知道数据在哪里结束,它可以优化order by id + limit 1到与到达相同的max(id)

现在少有人走的路是当您没有自动递增的主键时。也许主键是一个自然键,它是 3 个字段的组合......不过,并不是所有的都丢失了。从编程语言中,您可以首先获得行数

SELECT Count(*) - 1 AS rowcount FROM <yourTable>;
Run Code Online (Sandbox Code Playgroud)

然后在LIMIT子句中使用获得的数字

SELECT * FROM orderbook2
LIMIT <number_from_rowcount>, 1
Run Code Online (Sandbox Code Playgroud)

不幸的是,MySQL 不允许子查询或LIMIT子句中的用户变量