MySQL如何添加查询来填充MySQL变量

时间:2018-03-15 20:45:06

标签: mysql

也许很简单,但对我来说,我不知道如何在“循环”的第一次迭代中添加一个查询来填充变量@lastValue。

以下是查询现在的样子:

    SELECT DATE_FORMAT(time,'%Y-%m-%d %H:%i:00') as time, SUM(diff) as value
FROM (select
             EL.time,
             EL.value,
             if(@lastSN = EL.sensor_id, EL.value - @lastValue, 0.0) as diff,
             @lastSN := EL.sensor_id,
             @lastValue := EL.value
      FROM data_test_debug EL, (SELECT @lastSN := 0,
                                @lastValue := 0) SQLVars
      WHERE EL.sensor_id = "ecam"
      AND EL.value_id = "gas"
      ORDER BY EL.time
     ) AS t
GROUP BY DATE_FORMAT(time,'%Y-%m-%d %H:%i:%s');

变量@lastValue的值在定义的第一次迭代 0.0 中。

问题 - >我必须通过另一个SELECT查询填充这个值,我该如何实现?对于这个例子,我们可以保持简单:

SELECT lastValue from table WHERE id=1

thx for help

1 个答案:

答案 0 :(得分:0)

使用另一个内联视图,就像SQLVars对其他变量所做的那样。或者你可以修改SQLVars视图。

e.g。

  FROM data_test_debug EL
 CROSS 
  JOIN ( SELECT @lastSN := 0 ) SQLVars
 CROSS
  JOIN ( SELECT @lastValue := t.lastvalue 
           FROM table t 
          WHERE t.id=1
          ORDER BY t.id, t.lastvalue
          LIMIT 1
       ) lv

我强烈建议放弃加入操作的旧式逗号语法,并将其替换为较新的JOIN关键字。对于MySQL,CROSS关键字不是必需的,但我认为它确实为未来的读者提供了ON条款的遗漏是有意的。

它不必是两个单独的内联视图,这将实现相同的结果:

  FROM data_test_debug EL
 CROSS
  JOIN ( SELECT @lastSN := 0
              , @lastValue := t.lastvalue
           FROM table t
          WHERE t.id=1
          ORDER BY t.id, t.lastvalue
          LIMIT 1
       ) lv

如果我们需要根据单独的查询设置多个变量,我们希望使用单独的内联视图。