簡體   English   中英

使用數據庫中已經存在的值更新數據庫的值

[英]Update values of database with values that are already in DB

我有一個數據庫,用於存儲從不同傳感器讀取的數據。 該表如下所示:

[SensorID] [timestampMS] [值]
[傳感器1] [123420] [10]
[傳感器1] [123424] [15]
[傳感器1] [123428] [6554]
[傳感器1] [123429] [20]


我要執行的操作如下:有些讀取已損壞(數字為6554),我想用下一個未損壞的值(在下面的示例中為20)更新該讀取。 。 因此,如果數字為6554,我想使用下一個值(以時間戳記)更新該值,則該值不會損壞。
我當時在考慮用PHP執行此操作,但我想知道是否可以直接使用SQL腳本來執行此操作。

欣賞:)

您可以使用相關的子查詢...

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

子查詢獲得以下所有結果,按timestampMS排序,僅獲取第一個結果。 這是該SensorID的下一個值。

注意:如果不存在“下一個”值,它將嘗試使用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) ,只需使用IFNULL(<sub_query>, value) ...

不確定這是否是有效的語法,無法對其進行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

我做了一個基於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用戶有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM