2016-06-26 28 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; 
相关问题