Ранг MySQL для нескольких пользователей - PullRequest
0 голосов
/ 14 марта 2020

Мне нужна помощь для задачи, которую я должен выполнить. У меня есть таблица, в которую включены следующие поля:

  1. Имя пользователя
  2. Счет
  3. Конкурс

Каждое имя пользователя может присутствовать в таблице несколько раз, таким образом, он может иметь несколько баллов. В любом случае имя пользователя может быть связано только с одной страной.

Ниже приведен пример моей таблицы:

Username !! Country || Score
Bob       ! Italy   !   100
Bob       ! Italy   !   150
Christian ! Italy   !   500
Christian ! Italy   !   200
Fred      | Germany |  80
Carl      | Germany |  700
Charlie   | France  |   400
Charlie   | France  |  280
Jean      | France  |   90

Я бы получил команду MYSQL, чтобы получить рейтинг каждого пользователя в его стране, учитывая только его лучший результат и отбрасывая остальные.

Поэтому мой идеальный результат должен выглядеть следующим образом:

Кристиан занимает первое место в Италии
Боб оценивается № 2 в Италии
Карл занимает № 1 в Германии

Фред занимает № 2 в Германии

Чарль ie занимает № 1 во Франции
Жан занимает № 2 во Франции

Я могу заказывать пользователей и иметь их звания, но имея все записи. То, что я хотел бы получить, это рейтинг с лучшими результатами.

Любая помощь очень ценится,

Большое спасибо

Ответы [ 2 ]

0 голосов
/ 17 марта 2020

Один из способов сделать это:

SELECT o1.Username, o1.Country, o1.maxScore, 
    (SELECT COUNT(DISTINCT s2.Username) 
     FROM `scores` s2
     WHERE o1.Country = s2.Country AND s2.Score > o1.maxScore) + 1 AS ranking
FROM (
     SELECT Username, Country, MAX(Score) AS maxScore
     FROM `scores` s1
     GROUP BY Username) o1

Это работает следующим образом:

  • 1-й получит максимальный балл для каждого имени пользователя на псевдоним "o1" (MAX(Score) AS maxScore)
  • 2-й с использованием результата maxScore, найденного выше, и подзапроса "s2" чтобы найти ранг для каждого имени пользователя и страны

Поскольку MAX(Score) AS maxScore является агрегированным результатом, мы не можем использовать подзапрос непосредственно в 1 запросе, но сначала нам нужно агрегировать результаты и использовать приведено максимальное количество баллов.

0 голосов
/ 14 марта 2020

Вы можете сделать это с помощью функции агрегации и окна rank(), если вы работаете MySQL 8.0

select 
    username,
    country,
    max(score) top_score,
    rank() over(partition by country order by max(score) desc) country_rank
from mytable
group by username, country
order by country, country_rank
...