我试图在我的数据库中存储一些通知。我正在接收来自某些机器的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
我不明白你的意思。我想更新它以跟上最新信息。这就是为什么我有两个日期时间,第一个是收到第一个这样的通知时,和'日期时间',看看是什么时候收到最新的这种信息。我想更新它,所以我不会每分钟都有相同通知的“虚拟”记录。 –