私はハイスコアテーブルを持っていますscores: (id int, deviceid int, value int, board int)
。特定のプレイヤーのポジションを表示したいのですが。現在、私はこれを行っています(PHPで):
プレーヤーがスコアとスコア自体を持っているすべてのボードを選択します。
select board, min(value) as value
from scores
where deviceid = 1234
group by board
次に、各行($ board、$ value)に対して次を選択します。
select count(id) from scores
where board = $board and value < $value
スコアが指定値未満の特定のボードの行数を選択することで、プレーヤーの位置を取得します(最初のプレーヤーは位置0を取得するため、表示されると1ずつ増加します)
私はこれがひどく非効率的であることを知っているので、私はそれをより速くする方法を探しています。カーソルを使用したストアドプロシージャで実行できる可能性がありますが、100枚のボードの場合、最大で1+100回の選択を実行する必要があります。
一言で言えば、疑似SQLで次のようなことをしたいと思います。
select board, min(value) as val,
count(id) from _this_group_ where value < val
from scores
where deviceid = 1234
group by board