ユーザーによる毎日のスコアを追跡するテーブルがあります。おおまかに次のようになります。
CREATE TABLE `DailyScores` (
`player_id` INTEGER NOT NULL,
`day_id` INTEGER NOT NULL,
`score` DOUBLE NOT NULL
);
次のようなプレーヤーテーブルもあります。
CREATE TABLE `Players` (
`player_id` INTEGER NOT NULL,
`weighted_score` DOUBLE NOT NULL
);
これで、プレーヤーのweighted_scoreは、プレーヤーの履歴データから毎日再計算されます。私はこれをいくつかのパスで行うことができます、次のようなものです:
-- Clear out the old values
UPDATE Players SET Players.weighted_score = 0;
-- Then several times with different @weight and @day values
UPDATE Players p JOIN DailyScores ds
ON p.player_id = ds.id
WHERE ds.day_id = @day
SET p.weighted_score = p.weighted_score + @weight * ds.score;
これは、プレーヤーがスコアエントリを持っていない日がある可能性がある場合を処理します。
ただし、UPDATEを次のように書き直したいと思います。
UPDATE Players p
JOIN DailyScores ds1 ON p.player_id = ds1.id
JOIN DailyScores ds2 ON p.player_id = ds2.id
JOIN DailyScores ds3 ON p.player_id = ds3.id
WHERE
ds1.day_id = @day1 AND
ds2.day_id = @day2 AND
ds3.day_id = @day3
SET p.weighted_score = @w1 * ds1.score + @w2 * ds2.score + @w3 * ds3.score;
しかし、スコアが不足していると、これは失敗すると思います。行方不明の日の値を0にする方法はありますか?