使用DB中已有的值更新数据库的值

时间:2011-03-22 13:45:20

标签: php mysql sql database

我有一个存储从不同传感器读取的数据的数据库。该表如下所示:

[SensorID] [timestampMS] [value]
[传感器1] [123420] [10]
[传感器1] [123424] [15]
[传感器1] [123428] [6554]
[传感器1] [123429] [20]


我想做的是以下内容:有些读取已损坏(数字为6554),我想用下一个未损坏的值更新(在下面显示的示例中为20) 。因此,如果一个数字是6554,我想用下一个值(在时间戳中)更新它,这是没有损坏的。
我想在PHP中这样做,但我想知道是否可以直接用SQL脚本来完成它。

欣赏:)

3 个答案:

答案 0 :(得分:2)

您可以使用相关的子查询...

UPDATE
  myTable
SET
  value = (SELECT value FROM myTable AS NextValue WHERE sensorID = myTable.SensorID AND timestampMS > myTable.timestampMS ORDER BY timestampMS ASC LIMIT 1)
WHERE
  value = 6554

子查询获得以下所有结果,按时间戳排序,只取第一个;这是该SensorID的下一个值。

注意:如果不存在“next”值,它将尝试使用NULL值进行更新。要解决此问题,您可以将其添加到WHERE子句...

  AND EXISTS (SELECT value FROM myTable AS NextValue WHERE sensorID = myTable.SensorID AND timestampMS > myTable.timestampMS ORDER BY timestampMS ASC LIMIT 1)


修改

或者,为了更短,只需使用IFNULL(<sub_query>, value) ...

答案 1 :(得分:2)

不确定这是否是有效的语法,无法测试它的ATM。您可能需要将其更改为JOIN而不是嵌套子查询,但在概念上,您可以执行类似(对于SQL Server):

UPDATE t1
SET Value = (   SELECT Value 
                from MyTable t2
                WHERE t2.SensorID =t1.SensorID
                    AND t2.[timestamp] = 
                    (   SELECT MIN([TimeStamp]) 
                        FROM mytable t3 
                        where t3.sensorid = t2.sensorID 
                            AND t3.[timestamp] > t2.[timestamp]
                    )
            )       
FROM Mytable t1
WHERE t1.value = 6554

答案 2 :(得分:1)

我根据Dems解决方案做了一个解决方法,它在Mysql中运行:

我已经创建了传感器表的“副本”,如下所示:

drop table if exists sensors_new;
create table if not exists sensors_new like sensors;
insert into sensors_new select * from sensors;

然后我做了Dems建议我做的事情,但是在select中使用这个新的aux表(以避免在同一个表中执行select时更新表时Mysql启动的错误。)

UPDATE
sensors
SET
raw_data = (SELECT raw_data FROM sensors_new AS NextValue WHERE sensor_id = sensors.sensor_id AND timestampMS > sensors.timestampMS ORDER BY timestampMS ASC LIMIT 1)
WHERE
value = 6554

然后,只需删除这个辅助表格。

我希望这有助于Mysql用户。