phpbar.de logo

Mailinglisten-Archive

Mysql SQL hacking, Highscores/Ranking

Mysql SQL hacking, Highscores/Ranking

Ilja Bekowies ibekowies at shavingkiwis.de
Mon Okt 17 14:07:38 CEST 2005


Hallo,

Wollte mal eure Meinung zu folgendem UPDATE statement hören...

Es geht um highscores (player zu game), wo ich zu jedem spieler zu jedem 
game einen Score speichere. Ich will aber jederzeit den Rank in der 
Liste haben, deshalb will ich per Cronjob die Listen updaten und die 
Ranks neu berechnen. Das mache ich folgendermaßen (Für Game 100):

Tabelle highscores:
player_id INT
game_id INT
rank INT
rank_tendency ENUM (up, down, hold)

###########################################
SET @rank = 0;
SET @last_score = -1;
UPDATE highscores SET
rank_tendency = IF(@last_score != score AND @rank := @rank + 1, 1, 1),
rank_tendency = IF(@last_score := score, 1, 1),
rank_tendency = IF(@rank > rank, 'up', IF(@rank < rank, 'down', 'hold')),
rank = @rank
WHERE game_id = 100
ORDER BY score DESC;
###########################################


Beschreibung:

rank variable auf 0
last_score auf -1
Update alle Scores zu Spiel 100 in ugekehrter Reihenfolge des 
Punktestandes (ORDER BY score DESC)
Pro Zeile:
setze "rank_tendency" auf 1 - um @rank hochzuzaehlen wenn @last_score 
ungleich dem aktuellem score ist
setze "rank_tendency" auf 1 - um @last_score auf den aktuellen score zu 
setzen
setze "rank_tendency" auf den richtigen ENUM, jenachdem ob @rank 
groesser, kleiner oder gleich dem aktuellen rank ist
setze rank auf @rank

Was mir nicht gefaellt ist dass ich die redundanten updates auf 
"rank_tendency" machen muss, nur um die Variablen zu veraendern... waere 
toll, wenn das auch anders ginge...


Gruesse, Ilja

-- 
Infos zur Mailingliste, zur Teilnahme und zum An- und Abmelden unter
-->>  http://www.4t2.com/mysql 


php::bar PHP Wiki   -   Listenarchive