sql >> Database >  >> RDS >> Mysql

Rang berekenen in PHP/MySQL

Als je een algemene ranglijst wilt, moet je helaas de hele tabel sorteren. Simpel gezegd, je kunt iemands rang in de tabel niet kennen zonder de andere rangschikkingen in de tabel te kennen.

Dat gezegd hebbende, als je je zorgen maakt over de prestaties, is er hier een vrij gemakkelijke oplossing - cache het resultaat van je rangschikkingsquery (misschien in een andere MySQL-tabel!), En vraag dat op voor al je reads. Wanneer iemand een nieuwe score plaatst, herbereken je je tijdelijke tafel. U kunt periodiek alle records onder een bepaalde rang wissen (bijvoorbeeld iedereen met een rangorde onder de 100 wordt van de scoretabel verwijderd) om de herberekeningen snel te houden, aangezien niemand ooit in rang zou stijgen nadat hij door een hogere score werd neergehaald.

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

Dan, wanneer je een rangorde voor een spel wilt lezen:

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


  1. Bulletin board - Database-optimalisatie

  2. Lijst van alle tabellen met een bepaalde kolomnaam

  3. MySQL:Waarom is de score altijd 1 in Fulltext?

  4. werk met json in orakel