Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Obliczanie pozycji w PHP/MySQL

Jeśli chcesz uzyskać ogólne rankingi, niestety musisz posortować całą tabelę. Mówiąc najprościej, nie możesz poznać czyjejś rangi w tabeli bez znajomości innych rang w tabeli.

To powiedziawszy, jeśli martwisz się wydajnością, jest tu dość łatwe rozwiązanie — buforuj wynik zapytania rankingowego (może do innej tabeli MySQL!) i zapytaj o to dla wszystkich swoich odczytów. Gdy ktoś opublikuje nowy wynik, ponownie oblicz tabelę tymczasową. Możesz okresowo usuwać wszystkie rekordy w ramach określonej rangi (powiedzmy, że każda osoba w rankingu poniżej 100 zostanie usunięta z tabeli wyników), aby przyspieszyć obliczenia, ponieważ nikt nigdy nie awansowałby w rankingu po powaleniu przez wyższy wynik.

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

Następnie, gdy chcesz odczytać rangę w grze:

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Przewijalny kursor PHP PDO MySQL nie działa

  2. Skopiuj bazę danych mysql ze zdalnego serwera na komputer lokalny

  3. Wybór wielu tabel a JOIN (wydajność)

  4. Klucz obcy MySQL, aby umożliwić NULL?

  5. mysql ERROR 2002 (HY000):Nie można połączyć się z lokalnym serwerem MySQL przez gniazdo '/var/run/mysqld/mysqld.sock' (2)