プレイヤーがマップを駆け抜けてスコアを付けるゲームがあります。各マップでどの試行が高得点であったかを調べ、それらのisHighScore
フラグをtrueに設定する必要があります。各マップのスコアが高くなるのは1回だけです。2回の試行で同じスコアが得られる場合は、時系列で最初に発生した試行のみにisHighScore
フラグを設定する必要があります。
現在使用しているSQLは次のようになります。
UPDATE attempts AS A1
SET isHighScore = 1
WHERE A1.ID =
(
SELECT A2.ID
FROM (SELECT ID, score, mapID, `date` FROM attempts) AS A2
WHERE A2.mapID = A1.mapID
ORDER BY A2.score DESC, A2.date ASC
LIMIT 1
)
((SELECT ... FROM attempts)
サブクエリはこの問題によるものです)
上記は、約75kエントリのテーブルで実行するのにタイムアウトよりも時間がかかります(はい、にインデックスがありますmapID, score, date
)。attempts
最も内側のクエリがテーブル全体を一時テーブルにコピーするためだと思いましたが、WHERE mapID = A1.mapID
条件をそのクエリに移動すると構文エラーが発生するため、どうすればよいかわかりません。また、内部クエリは行ごとに1回実行されます。これを修正する方法はあるのでしょうか?
MySQLでこのクエリを書くためのより良い方法を知っている人はいますか?