Si vous voulez des classements généraux, vous devez malheureusement trier toute la table. Autrement dit, vous ne pouvez pas connaître le rang de quelqu'un dans la table sans connaître les autres rangs du tableau. Cela dit, si vous êtes inquiet au sujet des performances, il y a une solution assez simple ici - cachez le résultat de votre requête de classement (peut-être dans une autre table MySQL!), Et interrogez-la pour toutes vos lectures. Lorsque quelqu'un publie une nouvelle note, recalculez votre table temporaire. Vous pouvez périodiquement vider tous les records sous un certain rang (par exemple, toute personne de moins de 100 ans est retirée du tableau des scores) pour accélérer les recalculs, car personne ne monterait dans le classement après avoir été renversé par un score plus élevé.
# 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;
Ensuite, chaque fois que vous voulez lire un rang pour un jeu:
select rank from leaderboards where game = '$game' and user_id = '$user_id';
Ma pensée est que si vous pouvez le faire dans MySQL, il serait à l'aide d'une table temporaire, subselect, et/ou calculer le numéro de ligne avec un alias Rank.L'astuce serait de faire en sorte que MySQL remplisse une table/sous-requête temporaire, puis de ne sélectionner qu'un seul résultat (le plus haut rang du joueur). Ce serait ce que je ne sais pas comment faire, sans essais et erreurs et tests. Voir: http://jimlife.wordpress.com/2008/09/09/displaying-row-number-rownum-in-mysql/ –
Je vous ai bien compris que vous recherchez le classement le plus élevé d'un utilisateur joueurs, et pas le meilleur score de ce joueur, non? –