我試圖在我的數據庫中存儲一些通知。我正在接收來自某些機器的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
我猜'insert insert觸發器會幫助你。在這裏你可以檢查是否需要插入或更新記錄。 – Utsav
如果你每次更新'in zone'時間戳都會很無奈,你可以把它改成'out zone'。我認爲你需要在改變sttus上寫下新紀錄 – splash58
我不明白你的意思。我想更新它以跟上最新信息。這就是爲什麼我有兩個日期時間,第一個是收到第一個這樣的通知時,和'日期時間',看看是什麼時候收到最新的這種信息。我想更新它,所以我不會每分鐘都有相同通知的「虛擬」記錄。 –