Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Rangberechnung in PHP/MySQL

Will man Gesamtrankings, muss man leider die ganze Tabelle sortieren. Einfach ausgedrückt, Sie können den Rang einer Person in der Tabelle nicht kennen, ohne die anderen Ränge in der Tabelle zu kennen.

Wenn Sie sich jedoch Sorgen um die Leistung machen, gibt es hier eine ziemlich einfache Lösung - speichern Sie das Ergebnis Ihrer Ranking-Abfrage (vielleicht in einer anderen MySQL-Tabelle!) und fragen Sie es für alle Ihre Lesevorgänge ab. Wenn jemand einen neuen Spielstand postet, berechnen Sie Ihre temporäre Tabelle neu. Sie können regelmäßig alle Datensätze unter einem bestimmten Rang löschen (z. B. jeder unter 100 wird aus der Punktetabelle entfernt), um die Neuberechnung schnell zu halten, da niemand jemals im Rang aufsteigen würde, nachdem er durch eine höhere Punktzahl niedergeschlagen wurde.

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

Dann, wann immer Sie einen Rang für ein Spiel lesen möchten:

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