serg23
serg23

Reputation: 13

Select same table twice, in single query

My table:

id | views | date
1  | 100   | 2017-03-09
2  | 150   | 2017-03-10
3  | 300   | 2017-03-11
4  | 350   | 2017-03-12

I need to calculate visit count difference between days something like this

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...

I managed to get similar results, but not exatcly what i wanted

$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/>";                     
    }                       
}

So i guess i need to select same table twice with one query.

Upvotes: 1

Views: 319

Answers (3)

juergen d
juergen d

Reputation: 204756

Group and order by the date. Then you can use a variable to store the last view value in it and compare it to the current one.

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

Upvotes: 0

Utsav
Utsav

Reputation: 8093

Try this to handle it in MySQL.

http://rextester.com/XXJWR75843

set @views1=0;
select t.* ,views-lag_views from (
select t1.*,@views1 lag_views , @views1:=views curr_views
from Table1 t1
    ) t

But you need to figure out a way to ignore first value, as it gives you same value as views.

Thanks for this answer to replicate lag function.

Upvotes: 0

bobflux
bobflux

Reputation: 11581

No need for SQL acrobatics here.

You are displaying the lines in date order. Simply keep the count from last line inside a variable, substract in php, and you have your difference.

Remove your nested loops. You only need one loop.

$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/>";                     
}                    

Upvotes: 1

Related Questions