MySQL在多个子查询中查询结果相同

时间:2015-03-26 11:58:10

标签: mysql sql query-optimization

我正在尝试优化以下查询。

SELECT t3.*, 
        (SELECT SUM(t4.col_sum)
            FROM (...) t4
            WHERE t4.timestamp BETWEEN CONCAT(SUBSTR(t3.timestamp, 1, 11), "00:00:00") AND t3.timestamp)
        AS cum_sum
FROM (...) t3

其中(...)是长查询的容器。它产生2列:timestamp和col_sum。我想通过编写查询来添加第三列。第三列是col_sum的累积和。

问题是我在两个地方放置相同的大查询(...)

有没有办法可以获得结果并在两个/多个地方使用结果(...)?

1 个答案:

答案 0 :(得分:1)

一种方法是使用临时表。

可能更有效的方法是使用变量来计算累积总和。它会是这样的:

  select t.*,
         (@c := if(@t = left(t.timestamp, 11), @c + t.col_sum,
                   if(@t := left(t.timestamp, 11), 0, 0)
                  )
         ) as cumesum
  from (. . .) t cross join
       (select @t := '', @c := 0) vars
  order by t.timestamp;

上述查询按timestamp对行进行排序。变量@t跟踪时间戳中的前11个字符 - 当我读取您的逻辑时,您希望仅在不变的组中进行累积求和。

变量@c跟踪累积总和,当遇到新的“前11个字符”时重置为零。逻辑看起来有点复杂,但最好将所有变量赋值放在一个表达式中,因为MySQL不保证表达式的求值顺序。