解決方法
* DUPLICATE KEY UPDATE内で、IF文、または CASE文を使う
IF文
IF(【条件式】, 【真の場合の値】, 【偽の場合の値】)
CASE文
* 以下の関連記事を参照。http://blogs.yahoo.co.jp/dk521123/17044389.html
サンプル
CREATE TABLE文
CREATE TABLE daily_events ( created_on DATE NOT NULL, last_event_id INT(11) UNSIGNED NOT NULL, last_event_created_at DATETIME NOT NULL, PRIMARY KEY (created_on) );
INSERT or UPDATE 条件付き
1回目(INSERT文)INSERT INTO daily_events (created_on, last_event_id, last_event_created_at) VALUES ('2015-11-20', 1, '2015-12-21 08:00:00') ON DUPLICATE KEY UPDATE last_event_id = IF(last_event_created_at < VALUES(last_event_created_at), VALUES(last_event_id), last_event_id), last_event_created_at = IF(last_event_created_at < VALUES(last_event_created_at), VALUES(last_event_created_at), last_event_created_at);2回目(2015-12-21 08:00:00' < '2015-11-21 08:00:00'ではないので、UPDATEされない)
INSERT INTO daily_events (created_on, last_event_id, last_event_created_at) VALUES ('2015-11-20', 1, '2015-11-21 08:00:00') ON DUPLICATE KEY UPDATE last_event_id = IF(last_event_created_at < VALUES(last_event_created_at), VALUES(last_event_id), last_event_id), last_event_created_at = IF(last_event_created_at < VALUES(last_event_created_at), VALUES(last_event_created_at), last_event_created_at);3回目(2015-12-21 08:00:00' < '2016-11-10 08:00:00'なので、UPDATEされる)
INSERT INTO daily_events (created_on, last_event_id, last_event_created_at) VALUES ('2015-11-20', 1, '2016-11-10 08:00:00') ON DUPLICATE KEY UPDATE last_event_id = IF(last_event_created_at < VALUES(last_event_created_at), VALUES(last_event_id), last_event_id), last_event_created_at = IF(last_event_created_at < VALUES(last_event_created_at), VALUES(last_event_created_at), last_event_created_at);
参考文献
https://thewebfellas.com/blog/conditional-duplicate-key-updates-with-mysqlhttp://qiita.com/yuzroz/items/f0eccf847b2ea42f885f