MySQL触发器 - 更新表中的最后一行,平均从另一个表中获取

时间:2017-12-27 15:33:59

标签: mysql sql phpmyadmin

我在创建MySQL触发器时​​遇到问题 - 我想更新表temp最后一行的avg_temp列,其中包含来自最后144条记录的平均值  temperature_C表中的stats列。我在INSERT发生之前通过phpmyadmin这样做。
我的代码,希望它有助于解释我希望代码执行的操作:

UPDATE avg_temp(`temp`)
SET (
    SELECT `id`, AVG(`temperature_C`)
    FROM `stats`
    GROUP by `id`
    LIMIT 144
)
ORDER BY id DESC
LIMIT 1
但是,这会引发语法错误。

如果有人能帮助我,那就太棒了。

3 个答案:

答案 0 :(得分:0)

这应该是MySQL更新的正确语法,使用子查询来计算最后144个值的平均值:

UPDATE avg_temp SET `temp` = AVG(
  (
    SELECT `temperature_C`
    ORDER BY id DESC
    LIMIT 144
  )
)
ORDER BY id DESC
LIMIT 1

答案 1 :(得分:0)

你可以使用一些subselect 对于正确的平均结果,您应该使用子选择获取144行

update avg_temp
set temp = ( select avg(t1.temperature_C)
      from (
        SELECT id, temperature_C
        FROM stats
        ORDER BY id
        LIMIT 144
      ) t1
  )  
  where id = your_id 

答案 2 :(得分:0)

您似乎想要:

UPDATE avg_temp
    SET `temp` = (SELECT AVG(temperature_C)
                  FROM (SELECT s.temperature_C
                        FROM stats s
                        ORDER BY id DESC
                        LIMIT 144
                       ) s
                )
ORDER BY id DESC
LIMIT 1;

但是,我会非常怀疑你这样做的愿望,特别是在触发器中。通常,触发器的效果取决于传递给触发器的记录中的数据。我想不出我曾经写过一个不引用这些数据的触发器(除测试或信息用途之外)的情况。

您似乎使用insert作为计时机制。相反,您可能只想创建一个视图,该视图返回最后144行(或最后144行但只有一行)的平均值。