【问题标题】:MySQL - How to select rows with max value of a fieldMySQL - 如何选择具有字段最大值的行
【发布时间】:2016-11-04 10:25:26
【问题描述】:

我有一张用户表,其中包含每个游戏级别的分数:

id | user_id | level | score
1  | David   | 1     | 20
2  | John    | 1     | 40
3  | John    | 2     | 30
4  | Mark    | 1     | 60
5  | David   | 2     | 10
6  | David   | 3     | 80
7  | Mark    | 2     | 20
8  | John    | 3     | 70
9  | David   | 4     | 50
10 | John    | 4     | 30

每个级别需要获取什么 SQL 查询,谁得分最高?

结果应该是:

id | user_id | level | score
4  | Mark    | 1     | 60
3  | John    | 2     | 30
6  | David   | 3     | 80
9  | David   | 4     | 50

谢谢

【问题讨论】:

  • 这是一个简单的group by 查询。你可以发布你的尝试吗?

标签: mysql sql


【解决方案1】:

如果你想打领带,那么你可以这样做:

select s.*
from scores s
where s.score = (select max(s2.score) from scores s2 where s2.level = s.level);

你可以通过聚合得到每一层的一行:

select s.level, s.score, group_concat(s.user_id)
from scores s
where s.score = (select max(s2.score) from scores s2 where s2.level = s.level)
group by s.level, s.score;

这会将用户(如果有多个)组合到一个字段中。

【讨论】:

    【解决方案2】:

    在子查询中按分数 desc 排序,然后按级别选择 max(score) 组。

    select id, user_id , level , max(score) as score
    from
    (select * from scores order by score desc)A 
    group by level  
    

    【讨论】:

      【解决方案3】:

      如果您只想要最先获得最高分的用户(每级没有平局):

      select *
      from users u1
      where id = (
          select id
          from users u2
          where u2.level = u1.level
          order by score desc, id asc
          limit 1
      )
      

      您应该有索引(id)(level, score, id)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-23
        • 2012-11-01
        • 1970-01-01
        • 2011-02-20
        • 1970-01-01
        • 2018-06-02
        • 1970-01-01
        相关资源
        最近更新 更多