如何选择表中ID最大的整行?


Answers:


228

您可以使用子选择:

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

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

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

SELECT row from table ORDER BY id DESC LIMIT 1

6
@AlirezaSoori:尽管有名字,但id它只是表中的一列。不能保证该id列中的值必须唯一。
unutbu

1
@unutbu假设它id不是主键或唯一键:)给定名称,则很有可能是它。还值得注意的是,根据您使用的DBMS,使用subselect的方法效率可能低得多。
Michael Mior 2014年

3
@MichaelMior:id可以是外键,在这种情况下,它可能不是唯一的。我使用进行了一些基准测试set profiling = 1; ...; show profiles,看来我们的解决方案使用MySQL时具有相同的性能。据我所知,您知道哪种DBMS的子选择性能较差吗?
unutbu 2014年

1
它可能是一个外键,但是正如我所说,我只是基于它的名字猜测。历史上已知MySQL的子选择性能差。但是,在较新的版本中,这已大大改善,因此取决于您使用的版本。但是,重新考虑一下,此特定查询可能没问题。尽管使用概要分析运行查询几次并不一定能说明相对性能。
Michael Mior 2014年

149

你也可以

SELECT row FROM table ORDER BY id DESC LIMIT 1;

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


为了具体执行OP的要求,我会这样做。但是其他答案的确可以更好地了解SQL结构:)
MatBailie 2011年

@Dems怎么样?没有其他答案的解释吗?我当然也对此感到内::(
Michael Mior

只是其他问题可以纠正语法而无需重构逻辑。因此,OP学习了如何正确声明特定的sql。
MatBailie 2011年

公平点:)尽管可以说其他答案仍在纠正逻辑。
Michael Mior

性能如何?我到达这里时,这种查询已经对我有用,但是我想知道这是否正确。是不是通过O(n * log n)操作进行订购?
2015年

27
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
老男孩

查询结果中的最新条目没有可信的含义,您需要具有用于插入时间的字段,依此类推。顺便说一句,请另外问您的问题,希望您会得到更多的关注-HTH;)。
shA.t

17

您不能给出,order by因为order by在表上进行了“全面扫描”。

以下查询更好:

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

18
ORDER BY如果您假设这id是表的主键,则不会进行完全扫描。(如果不是,它的名称就很差。)如果不是,那么您希望MAX(id)在没有全表扫描的情况下如何工作?如果没有索引,则仍必须检查每个值以找到最大值。
Michael Mior

@CakeLikeBoss好吧,我实际上尝试了“ order by”查询和您的“ SELECT * FROM table WHERE id =(SELECT MAX(id)FROM table);”;对114行的表进行查询,而此查询每次恰好花费0.0004秒,而第二个查询从0.0007秒花费到0.0010秒,我重复了几次
prabhjot

0

试试这个

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

9
TOP关键字在MySQL中不起作用。此查询将不起作用。
Anirudha Gupta

@toddmo:MySQL!Sql-Server对其他人也没有帮助。您的意思是MS-SQL?
riserr17年

@raiserle,您能帮我找到我对此问题的评论或发表之处吗?我在任何地方都看不到我的名字。
toddmo '17

0

人们也总是可以使用分析功能,这将给您更多的控制权

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()或density_rank()中进行选择。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.