2011-12-06 26 views
1

私はこれ以上深刻な脳のおならを抱えているが、基本的に私はこれに似たテーブルを持っている -回避策

+ 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  + 

何私は単一で(された後ですクエリ) -

行が存在する場合、すなわち:日付フィールドはX日付よりも古い場合staff_id = 6と位置=ベッドフォードは、その後だけ行を更新する行が存在します。そうでない場合

、行が存在しない場合(staff_id = 6と位置=ベッドフォードシャー州の行が存在しない)、新しい行としてデータを挿入します。

通常は、使用する -

INSERT....ON DUPLICATE KEY UPDATE... 

をしかしDUPLICATEで使用している場合、あなたは、IIRC、UPDATE文でWHERE句を使用することはできません。また、重複のためにlocationとstaff_idフィールドでUNIQUEインデックスを使用することはできません。

だから私は、の線に沿って、クエリの後だ -

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

は、このようにすべての挿入/更新を行うのだろうか?このロジックを使って複製を作成することはどうでしたか? –

+0

あなたは、MySQLでREPLACE – ajreal

答えて

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`); 
+0

おかげでnewtover、御馳走を働いているように見えた必要があります! –