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

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

MySQLで子データのスコアを親ごとに足したものを違うテーブルに保存するクエリ。SELECTとUPDATEを同時に行う。

MySQLで子データのスコアを親ごとに足したものを違うテーブルに保存する方法です。

SELECTとUPDATEを同時に行います。

構造的には

UPDATE 保存先テーブル名
( SELECT 親テーブル名, SUM(子テーブル名.score) amount
FROM 子テーブル名 LEFT JOIN 親テーブル名 ON 子テーブル.親テーブルid = 親テーブル.id) PA
SET 保存先テーブル名.score = PA.amount
WHERE 保存先テーブル名.親テーブルid = PA.id

このような感じです。 二行目に出てくる amount というのは、SUM(足し算)した結果に「amount」という名前を付けるよ、という意味です。 3行目に出てくる PA というのは、 2行目から3行目にかけて ()でくくって定義したテーブルの名前を「PA」という名前にして表しますよ、という意味です。 名前は何でもいいです。PAの中にはamountが入っているので、PA.amount という表記で値が取得できるわけです。

実際のコード例です

UPDATE club_scores,
(SELECT clubs.id, SUM(club_results.score) amount
FROM club_results LEFT JOIN clubs ON club_results.club_id = clubs.id WHERE club_results.club_id = clubs.id GROUP BY clubs.id) EC
SET club_scores.score = EC.amount
WHERE club_scores.club_id = EC.id;

これで、SELECTとLEFT JOINを使って足し算をしたスコアを UPDATEを使って、違うテーブルに 保存(アップデート)することが出来ました。