【问题标题】:MySQL: "order by" inside of "group by"MySQL:“group by”中的“order by”
【发布时间】:2011-07-18 17:50:24
【问题描述】:

我有一个names 的 MySQL 表,它由两个字段组成:namerankname 值不唯一,可以有多个匹配项。

问题:我想选择记录,按name分组,但是如果有多个name,应该取rank最高的那个。

一个例子:

汤姆 2

本 1

本 2

SELECT * FROM names GROUP BY name 通过rank DESC 订购

通常返回:

汤姆 2

本 1

我需要:

汤姆 2

本 2

因为有两个 Ben,但第二个排名更高。

似乎 MySQL 分组采用了名字而忽略了其余的。

我如何在“group by”中对记录进行排序,所以我可以说如果有多个具有相同 name 的记录应该采取哪条记录?

【问题讨论】:

    标签: mysql group-by


    【解决方案1】:

    您需要一个名为maxaggregate function

    select name, max(rank)
      from names
     group by name;
    

    这样您将检索所有不同的名称,每个名称都与其最高排名相关联。

    【讨论】:

    • 您仍然必须使用group by name,以便返回每个namemax(rank),而不是整体max(rank)
    • @Dennis:是的。已经添加了那部分。忘记了急于让问题成为第一个问题。 :-)
    • 这给出了每个名字都有最高排名的行,你只想要排名最高的名字吗?
    【解决方案2】:

    对我来说已经成功了:

    获取组内的最后一行:

    select * from 
    ( select name, rank from names order by rank desc ) as a 
    group by name
    

    【讨论】:

    • 语法不正确(你不能select *group by name
    • 我想您没有尝试这样做,因为如果您尝试过,您就会知道它有效。不仅在这个例子中,你还可以获取最大行行中的所有信息。
    • +1 你说得对,我不知道mysql 支持这样的语法。 MSSQLOracle 不要...
    【解决方案3】:

    使用max():

    select name,
           max(rank)
    from names
    group by name
    order by max(rank) desc
    

    【讨论】:

      猜你喜欢
      • 2013-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-06
      • 2021-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多