按日期在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用于下一个周期。
由于内部查询按天排序,因此它会处理它们全部。但是现在,您需要相反的方式,因此我必须将该查询包装到自己的内容中,并从中选择所有内容,但现在按日期排序以使最近的日期位于列表顶部。
我每天在slot2增加的午夜加入新的数据。所以在PHP我想回声示例: 2017-08-09 slot2 - 2017-08-08 slot2 = 66770 对不起,错误的表我现在发布更早更正。将查看您的链接谢谢。 – Elx
@Elx,如果您错过了其他示例的上下文,则会更新查询示例。 – DRapp