Tenho uma tabela relacionada a resultados de jogos com mais de 300 mil registros, onde cada linha guarda o ataque do jogador. Este é um exemplo de tabela simplificado. Eu mantenho um ID de ataque, data, quando o ataque foi feito, ID exclusivo do jogador, nome do jogador (alterável por jogador) e resultado (valor bool, vitória ou derrota).
ataque_id | data | ID_do_jogador | nome do jogador | resultado |
---|---|---|---|---|
1 | 09/03/2024 00:00:00 | 1 | gato | 1 |
2 | 10/03/2024 00:00:00 | 1 | panda | 1 |
3 | 11/03/2024 00:00:00 | 2 | cachorro | 0 |
4 | 12/03/2024 00:00:00 | 3 | lobo | 1 |
Quero mostrar os 10 melhores jogadores de ataque e minha consulta é assim:
SELECT
player_id as id,
player_name as name,
count(attack_id) as attacks,
sum(result) as victory,
( count(attack_id) - sum(result) ) as defeat,
( sum(result) - ( count(attack_id) - sum(result) ) ) as difference
FROM `my_table_name`
GROUP BY player_id
ORDER BY difference DESC
LIMIT 10
A consulta calcula as vitórias, derrotas dos jogadores e a diferença entre vitórias e derrotas. O problema aqui está relacionado ao nome do jogador. O jogador pode alterar um nome após alguns ataques, mas esta consulta retorna o primeiro player_name (relacionado ao player_id), não o último (atual).
Resultado desta consulta (de acordo com meu exemplo, em vez de gato, deveria ser panda, pois foi o nome do ataque do último jogador):
eu ia | nome | ataques | vitória | derrota | diferença |
---|---|---|---|---|---|
1 | gato | 2 | 2 | 0 | 2 |
3 | lobo | 1 | 1 | 0 | 1 |
2 | cachorro | 1 | 0 | 1 | -1 |
Como posso resolver esse problema?