我有3个表,名称分别为USER
,SCORE
和LEVEL
,如下所示。
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;
但是,此查询将返回所有级别的最高得分。如何修改此查询,以便只为每个用户显示最高级别?
如果要为每个用户提取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;