Mysql
 sql >> Database >  >> RDS >> Mysql

Calcolo del grado in PHP/MySQL

Se vuoi una classifica generale, sfortunatamente devi ordinare l'intero tavolo. In poche parole, non puoi conoscere il grado di qualcuno nella tabella senza conoscere gli altri gradi nella tabella.

Detto questo, se sei preoccupato per le prestazioni, qui c'è una soluzione abbastanza semplice:memorizza nella cache il risultato della tua query di classificazione (forse in un'altra tabella MySQL!) E interrogalo per tutte le tue letture. Quando qualcuno pubblica un nuovo punteggio, ricalcola la tua tabella temporanea. Puoi svuotare periodicamente tutti i record al di sotto di un certo grado (ad esempio, chiunque abbia un punteggio inferiore a 100 viene rimosso dalla tabella dei punteggi) per mantenere veloci i calcoli, dal momento che nessuno salirebbe mai di grado dopo essere stato abbattuto da un punteggio più alto.

# 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;

Quindi, ogni volta che vuoi leggere la classifica di un gioco:

select rank from leaderboards where game = '$game' and user_id = '$user_id';