也许很简单,但对我来说,我不知道如何在“循环”的第一次迭代中添加一个查询来填充变量@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
答案 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
如果我们需要根据单独的查询设置多个变量,我们希望使用单独的内联视图。