Вам нужно будет использовать подзапрос, чтобы вывести счет.
select distinct
name,
max(level) as level,
(select max(score) from highscores h2
where h2.name = h1.name and h2.level = h1.level) as score
from highscores h1
group by name
order by level desc, score desc
Приветствия
Эрик
Меня раздражает, что я не нашел времени, чтобы объяснить, почему это так, когда я опубликовал ответ, поэтому вот так:
Когда вы вытягиваете все (*), а затем максимальный уровень, вы получаете последовательно каждую запись плюс столбец с максимальным уровнем. Обратите внимание, что вы не группируете по количеству очков (что дало бы вам Боба 2 41, а Боба 3 21 - две записи для нашего друга Боба).
Итак, как, чёрт возьми, мы это исправим? Вам необходимо выполнить подзапрос, чтобы дополнительно отфильтровать результаты, что и есть (выберите max (оценка) ...). Теперь для каждой строки, в которой читается Боб, вы получите его максимальный уровень (3) и максимальный балл на этом уровне (21). Но это все равно дает нам сколько угодно строк у Боба (например, если у него 5 рядов, вы получите 5 рядов Боба 3 21). Чтобы ограничить это только лучшим показателем, нам нужно использовать предложение DISTINCT в операторе выбора, чтобы возвращать только уникальные строки.
ОБНОВЛЕНИЕ: правильный SQL (не могу комментировать пост le dorfier):
SELECT h1.Name, h1.Level, MAX(h1.Score)
FROM highscores h1
LEFT OUTER JOIN highscores h2 ON h1.name = h2.name AND h1.level < h2.level
LEFT OUTER JOIN highscores h3 ON h1.name = h3.name AND h2.level = h3.level AND h1.score < h3.score
WHERE h2.Name IS NULL AND h3.Name IS NULL
GROUP BY h1.Name, h1.Level