Ho scritto un gioco stupido e voglio avere una sorta di sito web della classifica.Query/schema SQL efficiente per una scheda leader
Solitamente le classifiche sono limitate a 10 o 20 giocatori migliori, ma ho pensato che sarebbe stato bello registrare per ogni giocatore, il loro punteggio più alto. Quindi, potrei sempre mostrare il loro rango mondiale.
Un semplice schema come ad esempio:
create table leaderboard (
userid varchar(128) not null,
score real not null,
when datetime not null
);
create index on leaderboard(userid);
sarebbe memorizzare la quantità minima di informazioni che ho bisogno - 1 ingresso per ogni utente con il loro miglior punteggio.
La mia domanda ruota attorno a come determinare in modo efficiente la posizione di qualcuno sulla classifica. L'idea generale è che vorrei la loro posizione nella lista restituita da:
select userid from leaderboard order by score desc
Ma l'esecuzione di questa query e quindi linearmente ricerca la lista sembra un po 'ridicolo per me dal punto di vista delle prestazioni DB. Anche così, sto avendo difficoltà a immaginare una query/schema che lo renderebbe un'operazione rapida.
Qualche idea?
(io preferirei mantenere lo schema DB e interrogare generico (non legato ad un fornitore). Ma, se un fornitore rende questo facile, sono felice di utilizzare MS SQL o MySQL.
Per chiarimenti, sto memorizzando solo il loro punteggio migliore. –
OK, quindi un indice sul miglior punteggio sarebbe la soluzione migliore. Se selezioni COUNT (1) dalla classifica WHERE topscore> = (SELECT score ... ecc.) Sarà efficiente, poiché sarà risolvibile semplicemente scansionando l'indice senza fare riferimento alla tabella stessa. – dkretz