我一直在忙着一些我已经获得了几行数据的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
我希望用这样的回声:
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);
感谢您帮助我。
答案 0 :(得分:1)
您可能希望看一下使用MySQL @variable用法(如内联程序)按顺序排列行之间的另一个帖子that does。
另一个显示+/-甚至在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用于下一个周期的任何内容。
由于内部查询是按日排序的,因此它会全部处理它们。但是现在,你想要反过来,所以我不得不将该查询包装成自己的并从中选择所有内容,但是现在,按日期顺序排序以使最新日期位于列表顶部。