SQL-запрос, не возвращающий различные значения

#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
  

Смотрите демонстрацию