СОЕДИНЕНИЕ с 3 таблицами и МАКСИМАЛЬНЫМ значением для комбинации столбцов - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть 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;

Но, этот запрос возвращает наивысший балл всех уровней на каждом уровне. Как я могу изменить этот запрос, чтобы для каждого пользователя отображался только самый высокий уровень?

1 Ответ

1 голос
/ 02 апреля 2020

Если вы хотите извлечь верхнюю строку вся для каждого пользователя, вы не можете использовать только агрегацию. Вместо этого вам понадобится фильтрация .

Если вы используете MySQL 8.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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...