【问题标题】:MAX function in where clause mysql [duplicate]where子句mysql中的MAX函数[重复]
【发布时间】:2014-04-27 14:41:12
【问题描述】:

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

 select firstName,Lastname,MAX(id) as max where id=max;

这给了我一个错误:

Unknown column 'max' in 'where clause'

有什么帮助吗?提前致谢。

【问题讨论】:

  • 您应该接受 spencer7593 为您的问题提供的答案
  • 这个问题还没有解决吗?不接受任何答案。如果没有一个答案是令人满意的,那么也许这个问题应该作为另一个已接受答案的问题的副本关闭。

标签: mysql sql max greatest-n-per-group


【解决方案1】:

我们不能在同一 SELECTWHERE 子句中引用聚合函数的结果(例如 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

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

 WHERE t.id = (SELECT MAX(id) FROM ... )

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

SELECT t.firstName
     , t.Lastname
     , t.id
  FROM mytable t
 ORDER BY t.id DESC
 LIMIT 1

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

这种方法可以扩展到多行,您可以通过将其更改为LIMIT 5 来获得具有最高 id 值的五行。

请注意,此方法的性能特别依赖于可用的合适索引(即,id 作为 PRIMARY KEY 或作为另一个索引中的前导列。)合适的索引将提高使用所有这些的查询的性能接近。

【讨论】:

    【解决方案2】:

    使用子选择:

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

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

    【讨论】:

      【解决方案3】:

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

      select firstName,Lastname,id 
      where {whatever}
      group by id
      having max(id)
      

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

      【讨论】:

      • 要是我在一个月或 6 年前看到这个就好了。简单,有效。喜欢它!
      • 如果所有内容都使用 group by 进行排序,我们应该在哪里输入什么......
      • 记住having 子句过滤了临时的结果集
      【解决方案4】:
      SELECT firstName, Lastname, MAX(id) as max WHERE YOUR_CONDITIONS_HERE HAVING id=max(id) 
      

      【讨论】:

        【解决方案5】:

        你想要最大 id 行的名字和姓氏吗?

        如果是这样(并且您缺少 FROM 子句):

        SELECT firstname, lastname, id
        FROM foo
        ORDER BY id DESC
        LIMIT 1;
        

        【讨论】:

          【解决方案6】:

          您使用的语法不正确。查询应该是这样的:

          SELECT column_name(s) FROM tablename WHERE id = (SELECT MAX(id) FROM tablename)
          

          【讨论】:

            【解决方案7】:

            此查询应该会返回您想要的数据。 将 foo 替换为您正在使用的表名。

            SQL 查询:

            select firstName,Lastname, id 
            from foo 
            having max(id) = id 
            

            【讨论】:

              【解决方案8】:

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

              MAX(id) as mymax ... WHERE ID - mymax
              

              【讨论】:

              • -1 不能在 WHERE 子句中引用列别名,也不能在 WHERE 子句中引用聚合函数的结果。这个答案是完全错误的。
              • 此答案中的第一句话是正确的,即max 用作选择列表中表达式的别名。但根据这一观察,答案没有任何意义。首先,MAX 不是保留字参考:http://dev.mysql.com/doc/refman/5.5/en/reserved-words.html。使用不同的别名有什么意义?它没有解决问题。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-11-17
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多