JOIN 与 3 个表,以及列组合的 MAX 值

JOIN with 3 tables, and MAX value for a column combination

我有 3 个表,名称为 USERSCORELEVEL,如下所示。

USER
+----+---------------+
| id | name          |
+----+---------------+
| 1 | Mr Alexander   |
| 2 | Ms. Duma       |
+----+---------------+

LEVEL
+----+------+
|id | seq   |
+----+------+
| 1 | 1     |
| 2 | 2     |
+---+-------+

SCORE
+----+---------+------------+-------+
|id | user_id  |  level_id  | score |
+----+---------+------------+-------+
| 1 | 1        |1           |3      | 
| 2 | 1        |2           |2      |   
| 3 | 1        |1           |4      |
| 4 | 1        |1           |2      | 
| 5 | 2        |1           |3      |
+---+----------+------------+-------+

根据这些表格,我正在尝试准备一个记分牌,其中每个用户将根据他们的级别和分数进行排列。并且对于每个用户,只会显示最高级别和该级别对应的最高分数。

我为此编写了一个 JOIN 查询,如下所示。

SELECT user.name, MAX(level.seq) as level, MAX(score.score) as score FROM
api_score score
JOIN api_level level ON level.id = score.level_id
JOIN api_user user ON user.id = score.user_id
group by user.id, level.seq
ORDER BY level DESC, score DESC;

但是,此查询返回所有级别中每个级别的最高分。我如何修改此查询,以便只为每个用户显示返回的最高级别?

如果您想为每个用户拉出 整个 顶行,您不能仅使用聚合。相反,您需要一些 过滤.

如果你是运行MySQL8.0,可以使用row_number():

select name, level, score
from (
select 
    user.name, 
    level.seq as level, 
    score.score as score,
    row_number() over(partition by user.id order by level.seq desc, score.score desc) rn
    from api_score score
    join api_level level on level.id = score.level_id
    join api_user user on user.id = score.user_id
) t
where rn = 1
order by level desc, score desc;