具有3个表的JOIN,以及一个列组合的MAX值

问题描述 投票:0回答:1

我有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;

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

mysql sql join greatest-n-per-group rdbms
1个回答
0
投票

如果要为每个用户提取entire第一行,则不能仅使用聚合。相反,您需要一些过滤

如果您正在运行MySQL 8.0,则可以使用row_number()

select name, level, score
fom (
    select 
        u.name, 
        l.seq as level, 
        s.score,
        row_number() over(partition by u.id order by l.seq desc) rn
    from api_score score
    join api_level level on l.id = s.level_id
    join api_user u on u.id = s.user_id
) t
where rn = 1
order by level desc, score desc;
© www.soinside.com 2019 - 2024. All rights reserved.