Но я не уверен, почему я должен использовать GROUP BY во втором решении, чтобы убедиться, что sql вычисляет счет для каждой оценки
Второй запрос работает самостоятельно присоединение к таблице при условии неравенства: для каждой строки с псевдонимом s1
вы получаете все строки в s2
, которые имеют меньшую или равную оценку. Затем вам нужно агрегировать, чтобы вы могли посчитать, сколько s2
строк имеется для каждого s1
, что дает вам рейтинг.
Примечание: если вы используете MySQL 8.0, вы можете сделать это без объединения или подзапроса, используя оконную функцию rank()
, которая делает именно то, что вы хотите:
select score, rank() over(order by score desc) rn from scores
Наконец, начиная с 2020 года, вы должны использовать явные , стандартные соединения, а не старые школы, неявные соединения:
select s1.score, count(distinct(s2.score)) rn
from scores s1
inner join scores s2 on s1.score <= s2.score
group by s1.id, s1.score
order by rn