【问题标题】:MySQL - Select the last inserted row easiest wayMySQL - 选择最后插入的行最简单的方法
【发布时间】:2011-02-15 18:27:48
【问题描述】:

我只需要选择条件指定的最后输入的行,例如:

SELECT ID from bugs WHERE user=Me

我只需要返回用户“我”输入的最后一个 ID。有没有一种简单的方法可以做到这一点?谢谢。

【问题讨论】:

  • 我找到的最佳答案是 Pomyk here的答案
  • 似乎有一个similar thread 已被回答。会不会是您正在寻找的解决方案?

标签: mysql select


【解决方案1】:

最好有一个默认为CURRENT_TIMESTAMPTIMESTAMP 列。这是您可以在此处找到的唯一真正的预测行为。

你可以做的第二好的事情是ORDER BY ID DESC LIMIT 1,并希望最新的ID是最大值。

【讨论】:

    【解决方案2】:

    你可以使用ORDER BY ID DESC,但如果你这样做会更快:

    SELECT * FROM bugs WHERE ID = (SELECT MAX(ID) FROM bugs WHERE user = 'me')
    

    如果您有一张巨大的桌子,它可能会产生重大影响。

    编辑

    您甚至可以设置一个变量以防您多次需要它(或者如果您认为它更易于阅读)。

    SELECT @bug_id := MAX(ID) FROM bugs WHERE user = 'me';
    SELECT * FROM bugs WHERE ID = @bug_id;
    

    【讨论】:

    • 我实际上已经对数百个查询进行了计时。 ORDER BY 'KEY' DESC LIMIT 1,可以比 SELECTSELECT 快 200+ 毫秒(超过 65%)。再说一次,我的数据库非常小,整个查询不会超过 900 毫秒,所以我认为在更大规模的排序可能会更慢。但是话又说回来,MYSQL 实现可能会优化常用查询,例如ORDER BY 'KEY' DESC LIMIT 1,因此最终结果将花费很多(很多!)而不是实际排序然后返回最后一个结果。
    • 好的,所以使用小桌子可能会更快。很高兴知道!不利的是,对于一张巨大的桌子,我的解决方案仍然要快得多。我用大约 35,000 行的表对其进行了测试,它比使用 ORDER 的解决方案快 10 倍。
    • 这是一个很好的解决方案。快速澄清:为什么我们不能 SELECT * FROM bugs WHERE ID = (SELECT MAX(ID) FROM bugs WHERE user = 'me') ...即为什么我们需要初始用户 = 'me' ?
    • @HopeKing 好点。我前段时间写了这个答案,所以我不确定为什么我两次输入user = 'me'。我对其进行了测试以确保并编辑了我的答案。感谢您指出。
    【解决方案3】:
    SELECT MAX(ID) from bugs WHERE user=Me
    

    【讨论】:

      【解决方案4】:

      实现此目的的一种方法是对记录进行排序并限制为 1。例如,如果您有下表(“数据”)。

          id | user | price
         -------------------
          1  |  me  | 40.23
          2  |  me  | 10.23
      

      试试下面的sql查询

        select * from data where user='me' order by id desc limit 1
      

      【讨论】:

        【解决方案5】:

        并发时,最新的记录可能不是你刚刚输入的记录。使用主键获取最新记录可能会更好。

        如果是自增字段,使用SELECT LAST_INSERT_ID();获取刚刚创建的id。

        【讨论】:

        • LAST_INSERT_ID() 是全球性的。它不会返回基于条件的 ID。
        • 在您尝试查询的行后不执行插入时有效。例如,如果有人注册(insert into users ...)然后创建一个帖子(insert into posts ...),last_insert_id() 将引用最后一个posts.id。此时,没有办法使用last_insert_id()选择最后一个用户。
        【解决方案6】:
        SELECT * FROM `table_name` 
        ORDER BY `table_name`.`column_name` DESC
        LIMIT 1 
        

        【讨论】:

          【解决方案7】:

          在从 php 运行 mysql 查询之后

          得到它

          $lastid=mysql_insert_id();
          

          这会为您提供 alst 自动增量 id 值

          【讨论】:

          • 没有人提到 PHP。即使他们这样做了,您为什么要建议使用已被弃用和无人维护这么长时间,最终在 PHP 7 中删除的 mysql_ 库?这是一个安全风险,如果你有 PHP7 或更高版本,甚至都不会工作。不应使用这个过时的库编写新代码。如果还在用的话,赶紧做个计划迁移到mysqli或者PDO吧。
          • 用户在 MYSQL 而非 MYSQLI 或 PDO 中请求
          • 呃,没有。问题是关于 SQL 代码本身。查看所有其他答案。就像我说的,甚至没有提到 PHP。 OP 对您所写的内容没有任何要求。使用 mysql_mysqli_PDO 不会改变底层 DBMS,它会改变用于连接数据库和执行查询的 PHP 代码库。每个都有不同的语法和功能,但它们都针对 MySQL 数据库服务器执行 SQL 查询。从您的评论看来您可能不了解 PHP 库和 SQL 语言之间的区别?
          【解决方案8】:
          MySqlCommand insert_meal = new MySqlCommand("INSERT INTO meals_category(Id, Name, price, added_by, added_date) VALUES ('GTX-00145', 'Lunch', '23.55', 'User:Username', '2020-10-26')", conn);
          if (insert_meal .ExecuteNonQuery() == 1)
          {
              long Last_inserted_id = insert_meal.LastInsertedId;
              MessageBox.Show(msg, "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
                      }
                      else
                      {
                          MessageBox.Show("Failed to save meal");
                      }
          

          【讨论】:

            【解决方案9】:

            从错误中选择 ID WHERE user=Me ORDER BY CREATED_STAMP DESC; BY CREATED_STAMP DESC 在最后创建的第一个索引处获取那些数据。

            希望能解决你的问题

            【讨论】:

              猜你喜欢
              • 2011-09-27
              • 1970-01-01
              • 2012-06-07
              • 1970-01-01
              • 1970-01-01
              • 2017-09-02
              • 1970-01-01
              • 2021-02-23
              • 1970-01-01
              相关资源
              最近更新 更多