【问题标题】:How do I select an entire row which has the largest ID in the table?如何选择表中 ID 最大的整行?
【发布时间】:2011-11-28 03:02:42
【问题描述】:

我该怎么做这样的事情?

SQL SELECT row FROM table WHERE id=max(id)

【问题讨论】:

标签: mysql sql


【解决方案1】:

您可以使用子选择:

SELECT row 
FROM table 
WHERE id=(
    SELECT max(id) FROM table
    )

请注意,如果max(id) 的值不唯一,则返回多行。

如果您只想要这样一行,请使用@MichaelMior 的回答,

SELECT row from table ORDER BY id DESC LIMIT 1

【讨论】:

  • @AlirezaSoori:尽管有这个名字,id 只是表中的一列。不保证id 列中的值必须是唯一的。
  • @unutbu 假设 id 不是主键或唯一键 :) 鉴于名称,很有可能它是。还值得注意的是,根据您使用的 DBMS,使用子选择的方法可能效率低得多。
  • @MichaelMior: id 可能是外键,在这种情况下它可能不是唯一的。我使用set profiling = 1; ...; show profiles 做了一些基准测试,看起来我们的解决方案使用 MySQL 具有相同的性能。据我所知,您知道哪些 DBMS 的子选择性能较差吗?
  • 它可能是外键,但正如我所说,我只是根据名称猜测它不是。历史上已知 MySQL 的子选择性能很差。不过,这在较新的版本中已经有了很大的改进,因此取决于您使用的版本。但是,重新考虑一下,这个特定的查询可能没问题。尽管使用分析运行几次查询并不一定能说明相对性能。
【解决方案2】:

你也可以

SELECT row FROM table ORDER BY id DESC LIMIT 1;

这将按 ID 降序对行进行排序并返回第一行。这与返回具有最大 ID 的行相同。这当然假设 id 在所有行中是唯一的。否则,id 的最大值可能会有多行,而您只会得到一个。

【讨论】:

  • 要专门执行 OP 的要求,我会这样做。但是其他答案确实提供了关于 SQL 结构的更好的教育:)
  • @Dems 怎么样?没有任何其他答案的解释?我当然也对此感到内疚:(
  • 只是其他问题在不重构逻辑的情况下更正了语法。因此,OP 学会了如何正确地声明特定的 sql。
  • 公平点 :) 尽管其他答案可以说仍在纠正逻辑。
  • 性能怎么样?我来到这里时,这种查询已经为我工作了,但我想知道这是否是正确的方法。 ORDER BY 不是 O(n * log n) 操作吗?
【解决方案3】:
SELECT * 
FROM table 
WHERE id = (SELECT MAX(id) FROM TABLE)

【讨论】:

  • @shA.t SELECT entry FROM table WHERE id = MAX(id) 不行吗?!
  • @shA.t 另外,我正在尝试执行以下操作:SELECT entry_time FROM users_unverified WHERE num_id = (SELECT MAX(num_id) FROM users_unverified WHERE account_email = :account_email) 我只需要数据库中最新条目的entry_time。该声明是否足够或应该是:SELECT entry_time FROM users_unverified WHERE num_id = (SELECT MAX(num_id) FROM users_unverified) AND account_email = :account_email
  • 查询结果中最近的条目没有可信的含义,你需要有一个插入时间等字段。 BTW,请单独提出您的问题,希望您能得到更多关注-HTH ;)。
【解决方案4】:

您不能提供order by,因为order by 会对表进行“全面扫描”。

下面的查询更好:

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

【讨论】:

  • 如果您假设id 是表的主键,ORDER BY 将不会进行完整扫描。 (如果不是,那么它的名字就很糟糕。)如果不是,你如何期望MAX(id) 在没有全表扫描的情况下工作?如果没有索引,则仍然必须检查每个值以找到最大值。
  • @CakeLikeBoss 好吧,我实际上尝试了“order by”查询和您的“SELECT * FROM table WHERE id = (SELECT MAX(id) FROM table);”查询一个有 114 行的表,而这个查询每次只花费 0.0004 秒,而第二个查询从 0.0007 到 0.0010 秒我重复了几次
【解决方案5】:

您也可以随时使用分析功能,这将为您提供更多控制权

select tmp.row from ( select row, rank() over(partition by id order by id desc ) as rnk from table) tmp where tmp.rnk=1

如果您根据数据类型遇到 rank() 函数的问题,那么也可以从 row_number() 或 dense_rank() 中进行选择。

【讨论】:

    【解决方案6】:

    试试这个

     SELECT top 1  id, Col2,  row_number() over (order by id desc)  FROM Table
    

    【讨论】:

    • TOP 关键字在 MySQL 中不起作用。此查询将不起作用。
    • @toddmo:MySQL!并且 Sql-Server 对其他人也没有帮助。你是说 MS-SQL?
    • @raiserle,你能帮我找到我在哪里评论或发布了关于这个问题的任何内容吗?我在任何地方都看不到我的名字附在这个问题上。
    猜你喜欢
    • 2021-07-21
    • 2013-04-03
    • 2011-02-22
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 2013-05-31
    • 1970-01-01
    相关资源
    最近更新 更多