繁体   English   中英

使用SELF JOIN的简单MySQL查询

[英]Simple MySQL query using SELF JOIN

我有一个称为图像表其是由其中记录可变REG下一个汽车登记的相机拍摄的图像的一个表中,摄像机编号它被采取可变相机和形式YYYY-MM-DD 00:00时间戳下:在变量whn下为00。 我被要求找到以下内容:

“对于由摄像机19捕获的每辆车-都要显示注册信息,最早在摄像机19处的时间以及离开该区域的时间和摄像机。”

因此,我找到了由摄像机19捕获任何特定汽车的最短时间,然后是该日期与该摄像机所捕获的摄像机一起捕获的那一天的最新时间。 到目前为止,我有以下代码:

SELECT early.reg,
   LEFT(MIN(early.whn), 10) AS date,
   RIGHT(MIN(early.whn), 8) AS 'in',
   RIGHT(MAX(late.whn), 8) AS 'out'
FROM image late
JOIN image early ON (early.reg = late.reg)
WHERE (early.camera = 19)
GROUP BY early.reg

这工作得很好,我只需要添加摄像机的最大时间,即在RIGHT(MAX(late(whn),8)AS'out'给定的最大时间处捕获,我正在努力做到这一点。 我尝试在SELECT调用中添加late.camera ,但是显然您必须添加GROUP BY late.camera ,它返回在每个摄像机上捕获的最新时间。 任何帮助表示赞赏。

您几乎需要额外的groupby,只需添加一个where子句以限制late.whn仅返回到最大

SELECT early.reg,
       LEFT(MIN(early.whn), 10) AS date,
       RIGHT(MIN(early.whn), 8) AS 'in',
       RIGHT(MAX(late.whn), 8) AS 'out',
    late.camera
    FROM image late
    JOIN image early ON (early.reg = late.reg)
    WHERE (early.camera = 19)
    and (late.whn = (select max(whn) from late))
    GROUP BY early.reg, late.camera

好的,现在有了更好的理解和明确的解释,以确保我得到您想要的...我得到的印象如下:

您正在监视交通,例如收费公路。 沿路线的北/南或东/西边界都有不同的摄像机。 在任何给定的日期,您都具有沿途所有摄像机读取的所有记录的交易的列表。 您想知道对于任何通过特定摄像头的汽车(并且我们不知道它的方向依据),您想知道汽车最终在那条路线上超出摄像头范围的地方。 例如:相机1-30。 您知道汽车在19号摄像机的视线范围内,但无论如何,它们可能在22号,26号,29号摄像机之后下车。 因此,对于那些在19号摄影机上看到的汽车,它们经过的最后一部摄影机在哪里。

如果这是正确的,那我就是故意的。 内部查询与ALMOST相同。 对于给定的车辆注册ID,我仍要存储它被发现的最小和最大日期(例如,假设摄像机是连续的,则可能在摄像机4上路,而在摄像机27上可能是连续的,但不是必需的)。 基于此的HAVING子句要求摄像机19是行程中包含的摄像机之一。 如果有人在摄像机1上上车而在摄像机18上下车,则不包括在内(提供的摄像机确实是顺序的,但出于跟进目的而更多)。

所以现在我有所有注册信息,最小和最大日期/时间。 现在,我将根据注册以及相应的最小或最大日期重新加入同一张图像表,因为每次注册它仅是一条记录,不需要在外部进行分组。 对于给定的摄像机,您永远不会有重复的时间,它必须存在于PQ查询中。

现在,只需拉动相应的摄像机即可。 因此,下面的查询实际上既提供了它们首先被识别的相机,又被认定为合格的相机19,以及相机最后被识别的位置。

SELECT
      PQ.Reg,
      LEFT(PQ.MinDateForDay, 10) AS date,
      RIGHT(PQ.MinDateForDay, 8) AS 'in',
      iMinDateCam.Camera CameraIn,
      PQ.TimeAtCamera19,
      RIGHT(PQ.MaxDateForDay, 8) AS 'out',
      iMaxDateCam.Camera CameraOut
   from
      ( SELECT 
              i.reg,
              min( i.whn ) as MinDateForDay,
              MAX( case when i.Camera = 19 then i.whn else '' end ) TimeAtCamera19,
              max( i.whn ) as MaxDateForDay
           FROM 
              image i
           GROUP BY 
              i.reg 
           having
              MAX( case when i.Camera = 19 then 1 else 0 end ) = 1 ) PQ
      join image iMinDateCam
         ON PQ.reg = iMinDateCam.reg
         AND PQ.MinDateForDay = iMinDateCam.whn
      join image iMaxDateCam
         ON PQ.reg = iMaxDateCam.reg
         AND PQ.MaxDateForDay = iMaxDateCam.whn

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM