首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用自连接的简单MySQL查询

问使用自连接的简单MySQL查询
EN

Stack Overflow用户
提问于 2017-07-20 12:21:55
回答 2查看 71关注 0票数 0

我有一张名为image的表格,它是由摄像机拍摄的一张表,它记录了可变区域下的汽车注册情况,它在可变摄像机下拍摄的摄像机号,以及yyyy dd 00:00:00 :00形式的时间戳。我被要求找到以下情况:

每一辆被摄像机捕捉到的车辆--显示登记,最早的时间,以及它离开区域的时间和摄像机。

因此,我正在寻找任何特定的汽车被摄像机19拍摄的最短时间,然后在那一天的最近一次,每辆车都和它拍摄的相机一起被捕获。到目前为止,我有以下代码:

代码语言:javascript
复制
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

这是非常好的工作,我只需要添加相机,最大的时间是在最大的时间是由右(最大(late.whn),8)给出的‘输出’,我正在努力做到这一点。我尝试在SELECT调用中添加late.camera,但是很明显,您必须按late.camera添加GROUP,后者返回在每个摄像机上捕获的最新时间。任何帮助都很感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-20 14:47:54

好吧,现在一个更好的理解和明确的解释,以确保我得到你想要的.我所得到的印象如下:

你在监控交通,比如收费公路。沿途有不同的摄像机,无论是向北/南或向东/向西。在任何给定的日期,您都有一个所有记录交易的列表,所有记录的事务由沿途的所有摄像机读取。你想知道,对于任何通过特定摄像头的汽车(我们不知道它的方向基础),你想知道这辆车在那条路线上最终是从摄像机范围里跑出来的。例:摄像头1到30。你知道汽车可以接近19号摄像机,但是他们可能会在22,26,29摄像机之后离开马路。所以,对于那些在19号摄像机上看到的汽车,他们最后经过的相机在哪里。

如果这是正确的,我是接近的意图。内部查询几乎相同。对于给定的车辆登记ID,我仍然在存储它被发现的最小和最大日期(例如,可以在第4摄像机处到达道路,如果相机是顺序的,但不是必需的,则可以在相机27下关闭)。基于此的“拥有”子句要求,照相机19是旅行中包括的照相机之一。如果有人在第1摄像机上,在第18镜头下下车,他们就不会被包括在内(前提是相机确实是连续的,但更多的是为了跟随目的)。

所以现在我有所有的注册,最小和最大的日期/时间。现在,我重新加入到相同的图像表的注册和各自的最小或最大日期,因为它将只是一个记录的每一个注册,不需要分组在外部水平。对于给定的相机,您永远不会有重复的次数,并且它必须从PQ查询中存在。

现在,把各自的相机拿出来。因此,下面的查询实际上给出了他们第一次识别的相机,合格的是通过摄像头19的相机,以及它们最后被摄像机识别的位置。

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2017-07-20 12:30:54

您已经接近完成了所需的额外groupby,只需添加一个where子句就可以将返回的late.whn限制为最大的

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45214569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档