我对此有一个严重的大脑放屁,但基本上我有一张看起来与此类似的表 -
+ id + staff_id + location + date + dismiss_boolean +
+------+-------------+-------------------+------------+-----------------+
+ 1 + 22 + Bedfordshire + 2011-11-01 + 0 +
+ 2 + 22 + Hertfordshire + 2011-11-02 + 1 +
+ 3 + 16 + Bedfordshire + 2011-12-01 + 0 +
+ 4 + 17 + Bedfordshire + 2011-11-22 + 0 +
+ 5 + 77 + Hertfordshire + 2011-11-01 + 1 +
+ 6 + 77 + Cambridgeshire + 2011-11-01 + 1 +
我所追求的是(在一次查询中) -
如果该行存在,即:有一行其中staff_id = 6且location = Bedfordshire,则如果日期字段早于 X ,则更新行 日期。
否则,如果该行不存在(没有staff_id = 6且location = Bedfordshire的行),则将数据作为新行插入。
通常你会使用 -
INSERT....ON DUPLICATE KEY UPDATE...
但是如果使用ON DUPLICATE,你不能在UPDATE语句中使用WHERE子句。再次,由于重复,您不能在location和staff_id字段上使用UNIQUE Indexes。
所以我正在查询 -
IF(
(SELECT COUNT(*) FROM `notifications` WHERE `staff_id` = '6' AND `location` = 'Bedfordshire') > 0
, UPDATE `notifications` SET `dismiss_boolean` = '1', `date` = '2011-12-10' WHERE `staff_id` = '6' AND `location` = 'Bedfordshire' AND `date` < '2011-12-10'
, INSERT INTO `notifications` (`staff_id`, `location`, `date`, `dismiss_boolean`) VALUES ('6', 'Bedfordshire', '2011-12-10', '1')
)
但是这会引发语法错误,并且从我记忆中错误地使用IF函数。
所以有人有任何想法我怎么能做到这一点?我能想到的唯一解决方案是在更新或插入数据之前查询表,但如上所述,理想情况下我想在单个查询中执行此操作。
任何帮助都会受到赞赏,因为我在一天的大部分时间里一直在解决这个问题,而且我还没有找到搜索Google / Stackoverflow的王牌。
答案 0 :(得分:1)
我不确定这是否仍然存在,但仅供参考:
INSERT INTO notifications
(staff_id, location, `date`, dismiss_boolean
VALUES ('6', 'Bedfordshire', '2011-12-10', '1')
ON DUPLICATE KEY UPDATE
dismiss_boolean = if(VALUES(`date`) < '2011-12-10',
VALUES(dismiss_boolean),
dismiss_boolean),
`date` = if(VALUES(`date`) < '2011-12-10',
VALUES(`date`),
`date`);