テーブルの年と月から3年以内(年度)のデータを判別してスコア計算、そうでなければ0を入れるクエリ
UPDATE data_results, (SELECT data_results.id, CASE WHEN ((YEAR(current_date)-2) < data_results.year) OR ( ((YEAR(current_date)-2) = data_results.year) AND (data_results.month >= 4) ) OR ( ((YEAR(current_date)-2) = data_results.year) AND (data_results.month = 0) ) THEN tournaments.t_point * game_types.g_point * results.r_point ELSE 0 END calc FROM (((data_results LEFT JOIN tournaments ON data_results.tournament_id = tournaments.id) LEFT JOIN game_types ON data_results.game_type_id = game_types.id) LEFT JOIN results ON data_results.result_id = results.id) GROUP BY data_results.id) CR SET data_results.result_score = CR.calc WHERE data_results.id = CR.id;
data_resultsというのは年月日のデータ、試合の結果、スコア が入っているテーブルです。 最初のSELECTの部分で、3年以内のデータを絞り込んでいます。
SELECT 選ぶカラム名 CASE WHEN 条件1 THEN 条件1のときの数値 ELSE 0 END calc それ以外なら(3年以内でなければ)0 を calc に入れる、という意味になっています。
calcというのは、ここで一時的に宣言している数値の入れ物です。
そのあとLEFT JOINを3つのテーブルに対して行っています。 リレーションのようなイメージです。
((( 大元のテーブル LEFT JOIN 繋げるテーブル1 ON 条件 ) LEFT JOIN 繋げるテーブル2 ON 条件) LEFT JOIN 繋げるテーブル3 ON 条件)
これで、大元のテーブルに3つのテーブルが繋げられます。括弧の数に気をつけましょう。 SELECTの中身(LEFT JOINしたテーブル)はCRという名前を付けています。
SETでスコアを挿入して、 WHEREでスコアを更新する場所を定義すれば完了です。