Позиция рейтинга без дубликатов - PullRequest
0 голосов
/ 31 марта 2020

У меня проблема с запросом, это мой старый вопрос, который был ранее решен mysql получить место в рейтинге, сгруппированное с объединенным столом

Проблема в том, что когда два игрока имеют с той же оценкой, запрос возвращает ту же позицию рейтинга, как 1-1-2-3 e cc. Как я могу это исправить? В таблице игрока также есть player_tickets (это количество сыгранных игр) и player_date, что является отметкой времени.

Я думал, что сначала получу свой рейтинг на основе player_score, player_tickets тогда и наконец player_date

Это мой старый запрос

SELECT *, 
       (SELECT 1 + Count(*) 
        FROM   players p2 
        WHERE  p2.`player_game` = p.`player_game` 
               AND p2.player_score > p.player_score  
               AND p2.player_status = 0) AS ranking 
FROM   players p 
ORDER  BY `player_game`, 
          player_score DESC

Ответы [ 3 ]

1 голос
/ 31 марта 2020

Просто добавьте критерии ранжирования к вашему предложению WHERE:

SELECT *, 
  (
    SELECT 1 + COUNT(*)
    FROM   players p2 
    WHERE  p2.player_game = p.player_game 
    AND
    (
      (p2.player_score > p.player_score) OR
      (p2.player_score = p.player_score AND p2.player_tickets > p.player_tickets) OR
      (p2.player_score = p.player_score AND p2.player_tickets = p.player_tickets AND p2.player_date > p.player_date) OR
      (p2.player_score = p.player_score AND p2.player_tickets = p.player_tickets AND p2.player_date = p.player_date AND p2.player_id > p.player_id)
    )
  ) AS ranking 
FROM players p 
ORDER BY player_game, player_score DESC;
1 голос
/ 31 марта 2020

Вы можете просто добавить больше столбцов к order by оконной функции:

rank() over (
    partition by player_game_id 
    order by player_score desc, player_tickets desc, player_date
) as rank

Если вы действительно хотите избежать получения одного и того же ранга дважды, вы также можете использовать row_number(), что гарантирует это - когда есть связи, row_number() влияет на отдельные числа (порядок которых, следовательно, не определен).

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

Вы можете добавить дополнительные сравнения в подзапрос. Или проще: используйте переменные:

select p.*,
       @rn := if(@g = player_game, @rn + 1,
                 if(@g := player_game, 1, 1)
                ) as ranking
from (select p.*
      from players p
      order by player_game, player_score desc, player_tickets desc, player_date desc
     ) p cross join
     (select @rn := 0, @g := 0) as seqnum;

В более новых версиях вы просто используете row_number(), если не хотите связей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...