うめぼしジョイスティック - ivoice

CakePHP、JavaScript、jQuery等のプログラミングについて書いていきます 思考は、うめぼしのように硬く、そして柔らかく。

テーブルの年と月から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でスコアを更新する場所を定義すれば完了です。