我正在尝试在我的数据库中存储一些通知。我从一些机器接收GPS数据,我想在下一个场景中发出通知(在mysql中记录): 1.如果收到的gps数据是假的 - > " GPS数据错误" 2.如果gps坐标匹配某个区域 - > "机器位于区域XY" 3.如果gps坐标不匹配区域 - > "机器超出XY区域"
表格如下:
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 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或UPDATE查询的一个常见答案是有一个语法:INSERT ... ON DUPLICATE KEY UPDATE ...我必须用它来制作一个由' MachineID'组成的唯一密钥对。和#39;注意'。但这对我来说是不可接受的,因为我想保持同样的记录,例如几条参赛作品。我想我必须在笔记上使用一些IF条件,但我真的不知道如何。任何帮助表示赞赏。
修改 所以我想出了使用交易的想法。但是,我有一些语法错误,我似乎无法自己弄清楚。我试过这个:
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 :(得分: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;