Php 在单个查询中选择同一个表两次

Php 在单个查询中选择同一个表两次,php,mysql,Php,Mysql,我的桌子: id | views | date 1 | 100 | 2017-03-09 2 | 150 | 2017-03-10 3 | 300 | 2017-03-11 4 | 350 | 2017-03-12 我需要计算两天之间的访问次数差,比如 2017-03-12-->Visitors:350 2017-03-11-->Visitors:300 Difference between days:50 2017-03-11-->Visitors

我的桌子:

id | views | date
1  | 100   | 2017-03-09
2  | 150   | 2017-03-10
3  | 300   | 2017-03-11
4  | 350   | 2017-03-12
我需要计算两天之间的访问次数差,比如

2017-03-12-->Visitors:350
2017-03-11-->Visitors:300
Difference between days:50

2017-03-11-->Visitors:300
2017-03-10-->Visitors:150
Difference between days:150

2017-03-10-->Visitors:150
2017-03-09-->Visitors:100
Difference between days:50

and so on...
我设法得到了类似的结果,但并不是完全符合我的要求

$sql = "SELECT * FROM `table` ORDER BY `table`.`id` DESC";
$result = mysql_query($sql) or die(mysql_error());
while($row = mysql_fetch_array($result))
{

    $t = $row['views'];  
    $dat = $row['date'];  


    $sql1 = "SELECT * FROM `table` ORDER BY `table`.`id` DESC LIMIT 1, 99";
    $result1 = mysql_query($sql1) or die(mysql_error());
    while($row1 = mysql_fetch_array($result1))
    {

        $y = $row1['views'];  
        $dat1 = $row1['date'];  

        $d = $t-$y;

        echo "{$dat}-->Visitors:{$t}";
        echo "<br/>";
        echo "{$dat1}-->Visitors:{$y}";
        echo "<br/>";
        echo "Difference between days:{$d}";
        echo "<br/><br/><br/>";                     
    }                       
}
$sql=“按表的顺序从表中选择*。`id`DESC”;
$result=mysql\u query($sql)或die(mysql\u error());
while($row=mysql\u fetch\u数组($result))
{
$t=$row['views'];
$dat=$row['date'];
$sql1=“按`表'顺序从`表'中选择*。`id`DESC LIMIT 1,99”;
$result1=mysql\u query($sql1)或die(mysql\u error());
而($row1=mysql\u fetch\u数组($result1))
{
$y=$row1[“视图”];
$dat1=$row1['date'];
$d=$t-$y;
echo“{$dat}-->访问者:{$t}”;
回声“
”; 回显“{$dat1}-->访问者:{$y}”; 回声“
”; echo“日差:{$d}”; 回声“


”; } }

所以我想我需要用一个查询选择同一个表两次。

这里不需要SQL Acrobatic

您正在按日期顺序显示行。只需将最后一行的计数保存在变量中,在php中使用减法,就可以得到差值

删除嵌套循环。你只需要一个循环

$last_views = null;

while($row = mysql_fetch_array($result))
{
    $views = $row['views'];  
    $dat   = $row1['date'];  

    if( $last_views === null ) 
         $delta_views = "";
    else
         $delta_views = $last_views - $views;

    $last_views = $views;

    echo "{$dat}-->Visitors:{$views}";
    echo "<br/>";
    echo "Difference between days:{$delta_views}";
    echo "<br/>";                     
}                    
$last_views=null;
while($row=mysql\u fetch\u数组($result))
{
$views=$row['views'];
$dat=$row1['date'];
如果($last_views===null)
$delta_views=“”;
其他的
$delta_views=$last_views-$views;
$last_views=$views;
回显“{$dat}-->访问者:{$views}”;
回声“
”; echo“两天之间的差异:{$delta_views}”; 回声“
”; }
按日期分组和订购。然后,您可以使用变量将最后一个视图值存储在其中,并将其与当前视图值进行比较

select date, 
       sum(views) as currentViews
       sum(views) - @previous as viewsDiff, 
       @previous := sum(views)
from your_table
cross join (select @previous:= 0) p
group by date
order by date

尝试在MySQL中处理它

但您需要找到一种忽略第一个值的方法,因为它提供与
视图相同的值


感谢您提供了复制滞后函数。

您可能需要为此添加演示,因为大多数人不熟悉此查询。只需使用变量存储前一行即可。并处理边缘情况,其中最初没有您想要的前一行。
set @views1=0;
select t.* ,views-lag_views from (
select t1.*,@views1 lag_views , @views1:=views curr_views
from Table1 t1
    ) t