php - Mysql: Gap detection query not detecting gaps -


it seems though gap detection picking whatever set timedifference , doing every interval based on that.

so here's explanation of data structure , i'm after:

i have database that's set this:

(schema name) historical      -cid      int uq ai nn       -id       int pk      -location varchar(255)      -status   varchar(255)      -time     datetime 

my data comes in looking (example 5 rows selected id)

 433275 | 97  | mylocation | ok | 2013-08-20 13:05:54  433275 | 97  | mylocation | ok | 2013-08-20 13:00:54  433275 | 97  | mylocation | ok | 2013-08-20 12:25:54  433275 | 97  | mylocation | ok | 2013-08-20 12:20:54  433275 | 97  | mylocation | ok | 2013-08-20 12:15:54 

in case above you'll notice i'm missing data 12:25:54 -> 13:00 id 97. trying write report tell me the: start of downtime, duration of downtime, , end of downtime (which i've been handling in php adding timediff time)

here's code (php -> mysql) (non-working) stands now:

        select *from (             select             y.*,             timestampdiff(minute, @prevdt, `time`) timedifference,             @prevdt := `time`             ddhistorical y,             (select @prevdt:=(select min(`time`) ddhistorical)) vars             id  = '". mysql_real_escape_string($id)."'             having timedifference > 16           ) s           order time desc           limit 25"; 

you need 2 levels of subquery:

select * (     select  y.*,             timestampdiff(minute, @prevdt, `time`) timedifference,             @prevdt := `time`             (select *                   ddhistorical                   id = '97'                   order `time`) y,                  (select @prevdt:=(select min(`time`) ddhistorical)) vars) z timedifference > 16 limit 25 

i'm not sure why outermost level needed. tried without (i.e. starting select y.*) , using having timedifference > 16. reason, reported single row timedifference = 45. if removed having clause, showed rows, gap reported 35 minutes. usually, there's no difference between

select ... having <cond> 

and

select * (select ...) <cond> 

i'm not sure why query violates rule -- suspect has user-variables.

edit:

i think i've figured out why didn't work having. mysql apparently evaluating condition calculates timedifference column each row, , discarding row. when timedifference <= 16, doesn't bother calculating rest of columns in select clause, never @prevdt := time. until gets past condition, it's comparing min(time).

moving timedifference check outer query forces calculate differences before filtering.

sqlfiddle


Comments

Popular posts from this blog

java - Run a .jar on Heroku -

java - Jtable duplicate Rows -

validation - How to pass paramaters like unix into windows batch file -