Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Calculando a classificação em PHP/MySQL


Se você quer classificações gerais, infelizmente você tem que ordenar a tabela inteira. Simplificando, você não pode saber a classificação de alguém na mesa sem conhecer as outras classificações na mesa.

Dito isso, se você está preocupado com o desempenho, há uma solução bastante fácil aqui - armazenar em cache o resultado de sua consulta de classificação (talvez em outra tabela MySQL!) e consultar isso para todas as suas leituras. Quando alguém postar uma nova pontuação, recalcule sua tabela temporária. Você pode liberar periodicamente todos os registros em uma determinada classificação (digamos, qualquer pessoa com classificação abaixo de 100 é removida da tabela de pontuações) para manter os cálculos rápidos, já que ninguém subiria na classificação após ser derrubado por uma pontuação mais alta.
# Create your overall leaderboards once
create table leaderboards (rank integer primary key, score_id integer, game varchar(65), user_id integer, index game_user_id_idx (game, user_id))


# To refresh your leaderboard, we'll query the ranks for the game into a temporary table, flush old records from scores, then copy
# the new ranked table into your leaderboards table.
# We'll use MySQL's CREATE TABLE...SELECT syntax to select our resultset into it directly upon creation.
create temporary table tmp_leaderboard (rank integer primary key auto_increment, score_id integer, game varchar(65), user_id integer)
  select ID, GameName, UserID, from scores where GameName = '$game' order by score desc;

# Remove old rankings from the overall leaderboards, then copy the results of the temp table into it.
delete from leaderboards where game = '$game';
insert into leaderboards (rank, score_id, game, user_id)
  select rank, score_id, game, user_id from tmp_leaderboard;

# And then clean up the lower scores from the Scores table
delete from scores join tmp_leaderboard on scores.id = tmp_leaderboard.score_id, scores.GameName = tmp_leaderboard.game where tmp_leaderboard.rank < 100;

# And we're done with our temp table
drop table tmp_leaderboard;

Então, sempre que você quiser ler uma classificação para um jogo:
select rank from leaderboards where game = '$game' and user_id = '$user_id';