JOIN 与 3 个表,以及列组合的 MAX 值
JOIN with 3 tables, and MAX value for a column combination
我有 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;
但是,此查询返回所有级别中每个级别的最高分。我如何修改此查询,以便只为每个用户显示返回的最高级别?
如果您想为每个用户拉出 整个 顶行,您不能仅使用聚合。相反,您需要一些 过滤.
如果你是运行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;
我有 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;
但是,此查询返回所有级别中每个级别的最高分。我如何修改此查询,以便只为每个用户显示返回的最高级别?
如果您想为每个用户拉出 整个 顶行,您不能仅使用聚合。相反,您需要一些 过滤.
如果你是运行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;