sql >> Databáze >  >> RDS >> Mysql

Výpočet hodnocení v PHP/MySQL

Pokud chcete celkové pořadí, musíte bohužel seřadit celou tabulku. Jednoduše řečeno, nemůžete znát něčí pořadí v tabulce, aniž byste znali ostatní pořadí v tabulce.

To znamená, že pokud se obáváte o výkon, existuje zde poměrně snadné řešení - uložte do mezipaměti výsledek dotazu na hodnocení (třeba do jiné tabulky MySQL!) a dotazujte se na všechna svá čtení. Když někdo zveřejní nové skóre, přepočítejte si dočasnou tabulku. Můžete periodicky splachovat všechny záznamy pod určitou úrovní (řekněme, že každý, kdo má hodnocení pod 100, bude odstraněn z tabulky skóre), aby se přepočty udržely rychle, protože nikdo by nikdy nešplhal v pořadí poté, co by byl sražen vyšším skóre.

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

Potom, kdykoli si budete chtít přečíst hodnocení hry:

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


  1. SQL Query pomalý v aplikaci .NET, ale okamžitý v SQL Server Management Studio

  2. Nepodařilo se načíst třídu ovladače com.mysql.jdbc.Driver

  3. php, mysql - Chyba příliš mnoha připojení k databázi

  4. Jak používat 'select' v příkazu MySQL 'insert'