3

私はハイスコアテーブルを持っています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
4

2 に答える 2

2
SELECT scores.board, count(1) AS position
FROM scores
JOIN
  (SELECT board, MIN(value) AS value
   FROM scores
   WHERE deviceid = 1234
   GROUP BY board
  ) player_scores
ON scores.board = player_scores.board
WHERE scores.value < player_scores.value
GROUP BY scores.board
于 2012-07-31T11:50:00.680 に答える
0

次のようなものを試すことができます:

SELECT a.board, b.val COUNT(1) AS cnt
FROM scores a
    INNER JOIN(
        SELECT board, MIN(value) as val
        FROM scores
        WHERE deviceid = 1234
        GROUP BY board
    ) b
     ON a.board = b.board
    AND a.value < b.val
WHERE a.deviceid = 1234
GROUP BY a.board;

また

SELECT a.board, MIN(a.value) as val,
       (SELECT COUNT(1)
        FROM scores b
        WHERE b.board = a.board AND
        b.value < MIN(a.value)) AS cnt
FROM scores a
WHERE a.deviceid = 1234;
于 2012-07-31T11:32:05.133 に答える