按日期在MySQL中从另一个行中减去另一行

问题描述:

我一直在忙于一些MySQL,其中有几行数据,我想从前一行中减去一行,然后重复所有的操作。 这里是我的表:按日期在MySQL中从另一个行中减去另一行

id day   vabaraha tagatis kasutajad slot2  
17 2017-08-01 592698  80477  108949  33821891  
18 2017-08-02 584221  80485  109124  33880051  
19 2017-08-03 591121  77525  109257  33920524  
20 2017-08-04 596247  77111  109269  33921504  
21 2017-08-04 599451  80216  109448  33950284  
22 2017-08-05 600504  79801  109542  33969574  
23 2017-08-06 606778  78750  109618  33982244  
24 2017-08-07 634498  72758  109817  34023524  
25 2017-08-08 621859  79007  109962  34099260  
26 2017-08-09 626617  77321  110092  34166030  

我想回声PHP是这样的:

id day   vabaraha tagatis kasutajad slot2  DIFF 
20 2017-08-04 596247  77111  109269  33921504 980 
19 2017-08-03 591121  77525  109257  33920524 40473 
18 2017-08-02 584221  80485  109124  33880051 

我尝试了一些LEFT JOIN,但不能弄明白。 我的代码:

if(! $conn) { 
     die('Could not connect: ' . mysql_error()); 
    } 

    $mysqltime = date ("Ymd"); 
    $agotime = date('Ymd', strtotime('-1 days')); 
    //echo $mysqltime. " <br> "; 
    //echo $agotime. "<br> "; 


    $sql = "SELECT c.day, c.slot2, COALESCE(c.slot2-a.slot2,0) diff 
FROM Omaraha c 
LEFT JOIN Omaraha a ON a.day < c.day 
LEFT JOIN Omaraha b ON a.day < b.day AND b.day < c.day 
WHERE b.day IS NULL;"; 

    mysql_select_db('investee_Omaraha'); 
    $retval = mysql_query($sql, $conn); 

    if(! $retval) { 
     die('Could not get data: ' . mysql_error()); 
    } 
    while($row = mysql_fetch_assoc($retval)) { 
     echo   
     "EMP NAME : {$row['newAmount']} <br> ". 
     "EMP SALARY : {$row['vabaraha']} <br> ". 
     "EMP SALARY : {$row['tagatis']} <br> ". 
     "EMP SALARY : {$row['slot2']} <br> ". 
     "--------------------------------<br>"; 
    } 

    echo "<br><br>!! Fetched data successfully !!\n"; 

    mysql_close($conn); 

谢谢你帮我。

您可能想要看看另一篇文章that does按行之间的顺序进行计算,无论使用哪种标准,MySQL @variable的用法都像在线程序一样。

另一个显示+/-甚至小组之间的工作由that might help you along

我不明白你为什么在相反的顺序那些特定ID,但你可以为了你的数据基础上通过无论你的基础是让计算开始,然后@variables的行为就像一个内联程序,并且它的值可用于正在处理的下一条记录。我提供的两个例子显示了这个应用的好例子。

如果你可以澄清你的聚合目的的背景,我可以更好地发表一个更详细的例子。为什么你以ID 20,19,18,17开头,然后ID又回到21,22,23等。你试图制定什么共同的元素。

从你的样本描述,我已经申请查询尝试使用sqlvariables ...

SELECT 
     pq.* 
    from 
     (SELECT 
       o.id, 
       o.day, 
       o.vabaraha, 
       o.tagatis, 
       o.kasutajad, 
       IF(@lastSlot2 = 0, 0, o.slot2 - @lastSlot2) DayDifference, 
       @lastSlot2 := o.slot2 
      from 
       Omaraha o, 
       (select @lastSlot2 := 0) sqlvars 
      order by 
       o.day) pq 
    order by 
     pq.Day descending  

所以,在这里,在sqlvars查询只需准备2级开头的变量,没有以前的“LastSlot2”价值,因为它代表列表过程的开始。数据按天顺序预先按日期顺序排序。我首先得到if()来检查。如果slot2没有以前的值,我只返回0.这将是第一个返回的最早的日期。在考虑该行后,我现在将slot2存储到“@ lastSlot2”变量中。现在,通过标识@ lasSlot2的下一个记录具有一个值,因此它可以取当前时隙并检测新记录的差异。每个随后的记录都有@ lastSlot2 =无论记录的slot2用于下一个周期。

由于内部查询按天排序,因此它会处理它们全部。但是现在,您需要相反的方式,因此我必须将该查询包装到自己的内容中,并从中选择所有内容,但现在按日期排序以使最近的日期位于列表顶部。

+0

我每天在slot2增加的午夜加入新的数据。所以在PHP我想回声示例: 2017-08-09 slot2 - 2017-08-08 slot2 = 66770 对不起,错误的表我现在发布更早更正。将查看您的链接谢谢。 – Elx

+0

@Elx,如果您错过了其他示例的上下文,则会更新查询示例。 – DRapp