使用来自选择的值的Mysql更新[重复]

Posted

技术标签:

【中文标题】使用来自选择的值的Mysql更新[重复]【英文标题】:Mysql Update using value from select [duplicate] 【发布时间】:2019-09-21 19:47:41 【问题描述】:

我有一个天气应用程序,我每小时将气象数据存储在数据库中。

最近我发现了一个小错误,导致写入了数百条错误记录。

为了解决这个问题,我决定使用当天的平均值更新所有错误记录。

我有以下 3 个查询来检索我需要的值:

select TRUNCATE( ( sum(temperature) / count(*) ), 2) as myTempAvg  from MY_TABLE where rawData not in ('chron', 'fallback') and DATE(transmissionDate) = DATE('2019-01-27');
select TRUNCATE( ( sum(humidity) / count(*) ), 2) as myHumyAvg  from MY_TABLE where rawData not in ('chron', 'fallback') and DATE(transmissionDate) = DATE('2019-01-27');
select TRUNCATE( ( sum(pressure) / count(*) ), 0) as myPressAvg  from MY_TABLE where rawData not in ('chron', 'fallback') and DATE(transmissionDate) = DATE('2019-01-27');

我正在尝试找出一种在 UPDATE 语句中使用上述查询的方法。比如:

update MY_TABLE set temperature = $QUERY_1_RESULT , humidity = $QUERY_2_RESULT , pressure = $QUERY_3_RESULT where rawData in ('chron', 'fallback')  and DATE(transmissionDate) = DATE('2019-01-27');

注意:$QUERY 变量用于解释用途占位符。

有什么想法吗?

【问题讨论】:

【参考方案1】:

您应该能够按照以下方式进行操作。

INSERT INTO MY_TABLE (temperature)
SELECT TRUNCATE( ( sum(temperature) / count(*) ), 2) as myTempAvg  
FROM MY_TABLE 
WHERE rawData not in ('chron', 'fallback')
AND DATE(transmissionDate) = DATE('2019-01-27');

【讨论】:

【参考方案2】:

你可以试试下面-

update MY_TABLE 
(
select TRUNCATE( ( sum(temperature) / count(*) ), 2) as myTempAvg ,
TRUNCATE( ( sum(humidity) / count(*) ), 2) as myHumyAvg,
TRUNCATE( ( sum(pressure) / count(*) ), 0) as myPressAvg
from MY_TABLE 
where rawData not in ('chron', 'fallback') and DATE(transmissionDate) = DATE('2019-01-27')
)as src
set temperature=myTempAvg ,humidity = myHumyAvg , pressure = myPressAvg
where rawData in ('chron', 'fallback')  and DATE(transmissionDate) = DATE('2019-01-27')

【讨论】:

在 MY_TABLE 之后缺少逗号,无论如何它可以工作。谢谢!

以上是关于使用来自选择的值的Mysql更新[重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用来自 SELECT 子查询的值的 UPDATE 查询,高效

具有重复值的回收站更新

使用以前的值更新 MySQL 中的列 [重复]

使用以前的值更新 MySQL 中的列 [重复]

使用另一个表中的条件进行更新[MySQL] [重复]

MySQL - 在一个查询中更新具有不同值的多行