「INSERT INTO 〜 SELECT 〜」のSELECT結果を「ON DUPLICATE KEY UPDATE 〜」で使う
「ON DUPLICATE KEY UPDATE」という構文がMySQL独自のものと知ったときは軽くショックを受けました*1。
まあ、そんなことはどうでもいいんです。
通常、「INSERT INTO 〜 SELECT 〜」ってGROUP節を使って集計したものをどっかのテーブルに入れるとかっていう時に使うと思うんですが、その集計結果が既にあるときにUPDATEする、ということがしたいですよね。
例えば次のようなクエリで。
INSERT INTO total (id,count) SELECT id, count FROM daily GROUP BY date
私は最初次のようにやってみましたが、これはエラーになります。
INSERT INTO total (id,count) (SELECT id, count FROM daily GROUP BY date) t ON DUPLICATE KEY UPDATE count = t.count
後から気づいたんですが、そもそもサブクエリ全体に派生テーブル名をつけてどうすんだって話ですね。
正しくはこうです。
INSERT INTO total (id,count) SELECT id, count FROM (SELECT id, count FROM daily GROUP BY date) t ON DUPLICATE KEY UPDATE count = t.count