Mysql递归减法和乘法值

时间:2014-03-29 01:12:03

标签: mysql join recursion sum

无法用文字解释我的问题,但有一个例子我可以清楚地表明:

我有一张这样的表:

id    num   val
0     3     10
1     5     12
2     7     12
3     11    15

我想查看所有行,并计算“num”的增加,并将该差值乘以“val”值。当我计算所有这些时,我想将这些结果加在一起。

这是我想在桌子上运行的数学方程式:

Result = (3-0)*10 + (5-3)*12 + (7-5)*12 + (11-7)*15
138 = Result

谢谢。

3 个答案:

答案 0 :(得分:2)

您可以使用mysql变量,但每个条目仍然会获得一条记录。

select
      @lastTotal := @lastTotal + ( (yt.num - @lastNum) * yt.val ) thisLineTotal,
      @lastNum := yt.num as saveForNextRow,
      yt.id
   from
      yourTable yt,
      ( select @lastTotal := 0,
               @lastNum := 0 ) sqlvars
   order by
      id

这个应该给你想要确认每个记录的计算结果。

现在,要获得一个记录和一个列结果,您可以将其包装起来,例如

select
      pq.thisLineTotal
   from
      (above entire query ) as pq
   order by 
      pq.id DESC
   limit 1

答案 1 :(得分:0)

这将给你总数。请务必按照您希望的顺序订购 - 我已按ID

订购
SET @runtot:=0;
SET @prevval:=0;

select max(rt) as total FROM (
SELECT
   q.val,
   q.num,
   (@runtot := @runtot + (q.num- @prevval) * q.val) AS rt,
   (@prevval := q.num) AS pv
FROM thetable q
ORDER by ID) tot

如果您想查看计算的详细信息,请忽略外部选择:

SET @runtot:=0;
SET @prevval:=0;

SELECT
   q.val,
   q.num,
   (@runtot := @runtot + (q.num- @prevval) * q.val) AS rt,
   (@prevval := q.num) AS pv
FROM thetable q
ORDER by ID

如果您的列值可能为负数,则使用max(rt)不会为总数工作。然后你应该使用:

SET @runtot:=0;
SET @prevval:=0;

select @runtot as total FROM (
SELECT
   q.val,
   q.num,
   (@runtot := @runtot + (q.num- @prevval) * q.val) AS rt,
   (@prevval := q.num) AS pv
    FROM thetable q
ORDER by ID) tot LIMIT 1

答案 2 :(得分:0)

假设您的样本数据表明ID是连续的,只需将表连接到自身:

select sum((t1.num-ifnull(t2.num,0))*t1.val) YourValue
from YourTable t1
  left join YourTable t2
    on t2.id = t1.id - 1;

http://www.sqlfiddle.com/#!2/40b9f/12