#mysql #sql #distinct
#mysql #sql #различные
Вопрос:
У меня есть таблица лидеров игры, состоящая из 500 строк данных, и я написал скрипт для возврата этих данных и отсутствия повторяющихся результатов. Тем не менее, я получаю повторяющиеся результаты, возвращаемые мне. Вот мой скрипт.
SELECT DISTINCT
username, score,
FIND_IN_SET(score, (SELECT DISTINCT GROUP_CONCAT(score ORDER BY score DESC)
FROM TPS_STATS)) AS rank
FROM
TPS_STATS
ORDER BY
rank ASC
LIMIT 100;
Пример повторяющихся результатов, которые я вижу, размещен в виде изображения.
Комментарии:
1. Дубликатов нет. Каждая строка отличается от другой.
DISTINCT username, score, ...
возвращает отдельные строки этих столбцов, а не отдельные столбцы. Можете ли вы опубликовать ожидаемый результат?2. Я ожидаю, что он не будет выбирать строки с одинаковым результатом, потому что, если это будет так, как здесь, то rank не сможет различать двух пользователей с одинаковыми результатами
3. Тогда скажите для rank = 1, какое имя пользователя будет выбрано? Вам нужны имена пользователей, не так ли?
4. Тогда это тот результат, который вам нужен. Все пользователи ранжированы по их баллам со связями.
5. Можете ли вы опубликовать этот желаемый результат?
Ответ №1:
Если ваша версия MySQL 8.0, то вы можете использовать row_number():
SELECT
username,
score,
row_number() OVER (ORDER BY score desc, username) rn
FROM TPS_STATS
ORDER BY score desc, username
LIMIT 100
Смотрите демонстрацию.
Если оно ниже:
select
username,
score,
(select count(*) from TPS_STATS where score > t.score)
(select count(*) from TPS_STATS where score = t.score and username < t.username) 1
rank
from TPS_STATS t
order by rank, username
limit 100
Смотрите демонстрацию