MAX函数在where子句mysql中

use*_*971 31 mysql sql max greatest-n-per-group

我如何在mysql查询的where子句中使用max()函数,我正在尝试:

 select firstName,Lastname,MAX(id) as max where id=max;
Run Code Online (Sandbox Code Playgroud)

这给了我一个错误:

Unknown column 'max' in 'where clause'
Run Code Online (Sandbox Code Playgroud)

任何帮助?提前致谢.

spe*_*593 46

您不能在同一查询的WHERE子句中引用聚合函数的结果(例如MAX()).

解决此类问题的规范模式是使用内联视图,如下所示:

SELECT t.firstName
     , t.Lastname
     , t.id
  FROM mytable t
  JOIN ( SELECT MAX(mx.id) AS max_id
           FROM mytable mx
       ) m
    ON m.max_id = t.id
Run Code Online (Sandbox Code Playgroud)

这只是获取指定结果的一种方法.还有其他几种方法可以获得相同的结果,其中一些方法的效率远低于其他方法.其他答案证明了这种方法:

 WHERE t.id = (SELECT MAX(id) FROM ... )
Run Code Online (Sandbox Code Playgroud)

有时,最简单的方法是使用带有LIMIT的ORDER BY.(注意,这种语法特定于MySQL)

SELECT t.firstName
     , t.Lastname
     , t.id
  FROM mytable t
 ORDER BY t.id DESC
 LIMIT 1
Run Code Online (Sandbox Code Playgroud)

请注意,这将只返回一行; 因此,如果有多个具有相同id值的行,则不会返回所有这些行.(第一个查询将返回具有相同id值的所有行.)

这种方法可以扩展为获得多行,您可以通过将其更改为具有最高id值的五行MAX().

请注意,此方法的性能尤其取决于可用的合适索引(即,WHERE使用PRIMARY KEY或另一个索引中的前导列.)合适的索引将使用所有这些方法来提高查询的性能.


Fab*_*ler 13

使用子选择:

SELECT row  FROM table  WHERE id=(
    SELECT max(id) FROM table
)
Run Code Online (Sandbox Code Playgroud)

注意:ID必须是唯一的,否则返回多行


jas*_*ara 6

某些 Mysql 版本不允许在子选择中使用“限制”。我对你(以及未来的我)的回答是使用组

select firstName,Lastname,id 
where {whatever}
group by id
having max(id)
Run Code Online (Sandbox Code Playgroud)

这允许您在选择区域中返回任何您想要的内容,而无需聚合字段。


Hem*_*abu 5

SELECT firstName, Lastname, MAX(id) as max WHERE YOUR_CONDITIONS_HERE HAVING id=max(id) 
Run Code Online (Sandbox Code Playgroud)


blu*_*zcz -3

您正在使用单词“max”作为列的别名。尝试:

MAX(id) as mymax ... WHERE ID - mymax
Run Code Online (Sandbox Code Playgroud)

  • -1 不能在 WHERE 子句中引用列别名,也不能在 WHERE 子句中引用聚合函数的结果。这个答案是完全错误的。 (7认同)