sql >> Databasteknik >  >> RDS >> Mysql

Beräknar rang i PHP/MySQL

Om du vill ha totalranking måste du tyvärr sortera hela tabellen. Enkelt uttryckt kan du inte veta någons rankning i tabellen utan att känna till de andra rankningarna i tabellen.

Som sagt, om du är orolig för prestanda finns det en ganska enkel lösning här - cachelagra resultatet av din rankningsfråga (kanske till en annan MySQL-tabell!), och fråga det för alla dina läsningar. När någon lägger upp en ny poäng, räkna om din tillfälliga tabell. Du kan med jämna mellanrum tömma alla poster under en viss rang (säg att alla som rangordnar under 100 tas bort från poängtabellen) för att hålla omräkningarna snabba, eftersom ingen någonsin skulle klättra i rang efter att ha blivit omkullkastad av en högre poäng.

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

Sedan, när du vill läsa en rankning för ett spel:

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


  1. De där jäkla stora föremålen

  2. Exportera en MySQL-databas till SQLite-databas

  3. VÄLJ rad efter DATEPART()

  4. MySQL High Availability Framework Explained – Del III:Failure Scenarios