这可能是一个白日梦,但我正在尝试让这两个单独工作的命令作为一个命令工作。而不是 XXXXX,我想在 select 语句中转储(它给我昨天的总数和今天的总数之差)。组合命令会找到最近的行(最大 idtanklevel)并用它自己和前一行的差异更新它。
update fw_db.tanklevel2 T3
inner join (select max(idtanklevel) as idtanklevel from fw_db.tanklevel2) T4
on T3.idtanklevel = T4.idtanklevel
set glycolsmallchange = XXXXX;
和
select round(sum((T1.glycolsmall) - (T2.glycolsmall)),2)
from fw_db.tanklevel2 T1, fw_db.tanklevel2 T2
where
T1.idtanklevel = (select max(idtanklevel) from fw_db.tanklevel2)
and
T2.idtanklevel=(select max(idtanklevel)-1 from fw_db.tanklevel2);
提前致谢。
最佳答案
以下是我如何在一条语句中完成所有这些工作。 (请注意,此查询假定 idtanklevel
是 PRIMARY KEY 或至少是 tanklevel2
表中的 UNIQUE KEY;如果不是这种情况,则需要调整查询。 )
记录每个表引用和每个内联 View 的用途的一些简短注释:
-- m = get id of latest row
-- t = get latest row (the row to be updated)
-- pr = get id for the prior row
-- pri = source for prior row id
-- l = id of latest row (identical to "m")
-- pv = get value from prior row
-- p = wrapper so we can join to row returned from pv
UPDATE fw_db.tanklevel2 t
JOIN ( SELECT MAX(idtanklevel) AS idtanklevel FROM fw_db.tanklevel2 ) m
ON m.idtanklevel = t.idtanklevel
CROSS
JOIN ( SELECT pv.glycolsmall
, pv.idtanklevel
FROM ( SELECT MAX(pri.idtanklevel) AS idtanklevel
FROM fw_db.tanklevel2 pri
WHERE pri.idtanklevel <
(SELECT MAX(l.idtanklevel) FROM fw_db.tanklevel2 l)
) pr
JOIN fw_db.tanklevel2 pv
ON pv.idtanklevel = pr.idtanklevel
LIMIT 1
) p
SET t.glycolsmallchange = ROUND(t.glycolsmall - p.glycolsmall,2)
请注意,上面的查询使用略有不同的技术来识别“先前”行。查询不是从最大 id 值中减去 1,而是获得第二高的 id 值(低于最大值的最高 id 值)。
要实现您的查询正在使用的相同策略(即从最大 id 值中减去 1,请删除上述查询的这一部分:
FROM ( SELECT MAX(pri.idtanklevel) AS idtanklevel
FROM fw_db.tanklevel2 pri
WHERE pri.idtanklevel <
(SELECT MAX(l.idtanklevel) FROM fw_db.tanklevel2 l)
) pr
并将其替换为:
FROM ( SELECT MAX(l.idtanklevel)-1 AS idtanklevel
FROM fw_db.tanklevel2 l
) pr
要测试此语句,而不实际执行更新,请删除 SET
子句并将 UPDATE
关键字替换为 SELECT
和一个列表让您看到返回的行的相关表达式,例如:
SELECT t.glycolsmallchange AS old_glycolsmallchange
, ROUND(t.glycolsmall - p.glycolsmall,2) AS new_glycolsmallchange
, t.idtanklevel AS latest_row_id
, t.glycolsmall AS latest_glycolsmall
, p.idtanklevel AS prior_row_id
, p.glycolsmall AS prior_glycolsmall
FROM
关于Mysql 将 max id 的行更新为 sum 语句的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14781058/