2016-06-26 52 views
1

我試圖在我的數據庫中存儲一些通知。我正在接收來自某些機器的GPS數據,並且我想在以下情況下發出通知(以mysql記錄): 1.如果接收到的GPS數據爲假 - >「GPS數據錯誤」 2.如果GPS GPS座標匹配某個區域 - >「機牀是在區域XY」 3.如果GPS座標不匹配區 - >「機牀是出區的XY」如果最後一條記錄包含相同的值則更新else INSERT

表看起來是這樣的:

ID MachineID  note  Datetime    FirstSignal 
............................................................................ 
1   5  in zone  2016-06-25 18:13:40 2016-06-25 18:02:40  
2   5  gps error 2016-06-25 18:19:40 2016-06-25 18:14:40     
3   5  in zone  2016-06-25 18:23:40 2016-06-25 18:20:40 
etc. 

因此,可以說,我得到機器每分鐘的數據。我想提出這樣一個通知: INSERT新的通知,如果該機器最後通知不是這樣的一樣:

INSERT into notifications (MachineID, note, Datetime, FirstSignal) VALUES (5, 'in zone', now(), now()) 

如果最後一個條目具有相同的通知我只是想上傳像這個:

UPDATE notifications SET Datetime=now() 
WHERE ID = (SELECT MAX(ID) FROM notifications WHERE MachineID=5) 

那麼如何結合這兩個查詢呢?我知道INSERT OR UPDATE查詢的一個普通答案是有一個語法:INSERT ... ON DUPLICATE KEY UPDATE ...我必須創建一個由'MachineID'和'note'組成的唯一密鑰對。但是這對我來說是不可接受的,因爲我想用相同的音符繼續輸入,例如很少有條目回來。我想我將不得不使用一些中頻條件,但我真的不知道如何。任何幫助讚賞。

編輯 所以我想出了使用交易的想法。但是,我有一些我自己無法想象的語法錯誤。我嘗試這樣做:

IF (SELECT note FROM notifications 
    WHERE MachineID='$podatki[mid]' ORDER BY Datetime DESC LIMIT 1) = '$notification' 
THEN 
    UPDATE notifications SET Datetime=now() 
    WHERE ID = (SELECT MAX(ID) FROM notifications WHERE MachineID='$podatki[mid]') 
ELSE 
    INSERT into notifications (0, MachineID, note, Datetime, FirstSignal) VALUES (0, '$podatki[mid]', '$notification', now(), now()) 
END IF; 

我也試過這樣:

IF EXISTS(SELECT * FROM notifications WHERE ID = (SELECT MAX(ID) FROM notifications WHERE MachineID='$podatki[mid]') AND note='$notification') 
      THEN 
      UPDATE notifications SET Datetime=now() WHERE ID = (SELECT MAX(ID) FROM notifications WHERE MachineID='$podatki[mid]') 
      ELSE 
      INSERT into notifications (0, MachineID, note, Datetime, FirstSignal) VALUES (0, '$podatki[mid]', '$notification', now(), now()) 
      END IF 

與這兩個我收到錯誤:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF EXISTS(SELECT * FROM notifications WHERE ID = (SELECT MAX(ID) FROM notificati' at line 1  
+0

我猜'insert insert觸發器會幫助你。在這裏你可以檢查是否需要插入或更新記錄。 – Utsav

+0

如果你每次更新'in zone'時間戳都會很無奈,你可以把它改成'out zone'。我認爲你需要在改變sttus上寫下新紀錄 – splash58

+0

我不明白你的意思。我想更新它以跟上最新信息。這就是爲什麼我有兩個日期時間,第一個是收到第一個這樣的通知時,和'日期時間',看看是什麼時候收到最新的這種信息。我想更新它,所以我不會每分鐘都有相同通知的「虛擬」記錄。 –

回答

0

較早的答案是正確的,IF語句只能內的工作存儲過程(除非服務器實際上是最近的MariaDB而不是MySQL)。但假設它是在一個存儲過程中,有兩個缺少分號和一個雜散'0',在語法上更正確的語句看起來像

 
IF (SELECT note FROM notifications 
    WHERE MachineID='$podatki[mid]' ORDER BY Datetime DESC LIMIT 1) = '$notification' 
THEN 
    UPDATE notifications SET Datetime=now() 
    WHERE ID = (SELECT MAX(ID) FROM notifications WHERE MachineID='$podatki[mid]') ; 
ELSE 
    INSERT into notifications (ID, MachineID, note, Datetime, FirstSignal) VALUES (0, '$podatki[mid]', '$notification', now(), now()); 
END IF; 
相關問題