好像我的间隙检测只是拿起我设置的时间差,并以此为基础在每个间隔内进行。

因此,这是我的数据结构以及后续工作的解释:

我有一个像这样设置的数据库:

(Schema Name)
Historical
     -CID      int UQ AI NN
     -ID       Int PK
     -Location Varchar(255)
     -Status   Varchar(255)
     -Time     datetime


我的数据看起来像这样(示例ID为5行)

 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


在上述情况下,您会注意到我丢失了ID为97的12:25:54-> 13:00的数据。我试图编写一个报告,告诉我:停机时间开始,停机时间,和停机时间结束(我一直在php中通过将timediff添加到Time中来进行处理)

这是我现在的代码(php-> mysql)(无法正常工作):

        select *from (
            SELECT
            y.*,
            TIMESTAMPDIFF(MINUTE, @prevDT, `Time`) AS timedifference,
            @prevDT := `Time`
            FROM ddHistorical y,
            (SELECT @prevDT:=(SELECT MIN(`Time`) FROM ddHistorical)) vars
            Where ID  = '". mysql_real_escape_string($ID)."'
            HAVING timedifference > 16
          ) s
          order by Time desc
          Limit 25";

最佳答案

您需要两个级别的子查询:

SELECT *
FROM (
    SELECT  y.*,
            TIMESTAMPDIFF(MINUTE, @prevDT, `Time`) AS timedifference,
            @prevDT := `Time`
            FROM (SELECT *
                  FROM ddHistorical
                  WHERE ID = '97'
                  ORDER BY `Time`) y,
                 (SELECT @prevDT:=(SELECT MIN(`Time`) FROM ddHistorical)) vars) z
WHERE timedifference > 16
LIMIT 25


我实际上不确定为什么需要最外部的级别。我尝试没有它(即以SELECT y.*开头)并使用HAVING timedifference > 16。由于某种原因,这报告了timedifference = 45的一行。但是,如果我删除该HAVING子句,它将显示所有行,报告的间隔为35分钟。通常,两者之间没有区别

SELECT ... HAVING <cond>




SELECT * FROM (SELECT ...) WHERE <cond>


我不确定为什么该查询违反了规则-我怀疑它与用户变量有关。

编辑:

我想我已经弄清楚了为什么HAVING无法使用它。 MySQL显然会在计算出每一行的timedifference列后立即评估该条件,并丢弃该行。当使用timedifference <= 16时,它不会麻烦计算SELECT子句中的其余列,因此它永远不会执行@prevDT := Time。因此,直到超过该条件,它始终与MIN(Time)进行比较。

timedifference检查移到外部查询中会强制其在过滤之前计算所有差异。

SQLFIDDLE

关于php - MySQL:间隙检测查询未检测到间隙,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18413654/

10-10 16:51