为同时满足SQL中两个条件的项选择

为同时满足SQL中两个条件的项选择,sql,data-processing,sqlyog,Sql,Data Processing,Sqlyog,我有一个向SQL数据库报告字段中项目的XYZ位置的系统。我试图通过过滤已知时间点(当项目通过一个点时)以及在通过一个点后项目应该在什么位置来识别移动项目,来过滤误报 我的逻辑是,如果一个项目在一个位置和时间,在另一个位置和时间,它必须已经移动 所以我有一个疑问: SELECT tag_ID, X_location*3.28, Y_location*3.28, locate_time FROM tag_blink_history WHERE (LOCATE_TIME > '201

我有一个向SQL数据库报告字段中项目的XYZ位置的系统。我试图通过过滤已知时间点(当项目通过一个点时)以及在通过一个点后项目应该在什么位置来识别移动项目,来过滤误报

我的逻辑是,如果一个项目在一个位置和时间,在另一个位置和时间,它必须已经移动

所以我有一个疑问:

SELECT tag_ID, X_location*3.28, Y_location*3.28, locate_time
FROM tag_blink_history
WHERE 
     (LOCATE_TIME > '2013-01-29 11:05:51' 
     AND LOCATE_TIME < '2013-01-29 11:06:56' 
     AND ((y_location*3.28 > 61) 
     AND (y_location*3.28 < 67.5)) 
     AND ((x_location*3.28 > 14.5) 
     AND (x_location*3.28 < 17.5)))
     AND (((y_location*3.28 > 70) 
     AND (y_location*3.28 < 75)) 
     AND locate_time < '2013-01-29 11:06:50' )
ORDER BY tag_id DESC

有什么想法吗?我意识到我在上面的查询中要求SQL同时在两个地方寻找一些不可能发生的事情,但我想要的是在这两个空间约束中都存在的记录-我想要在这两个空间约束中都存在的记录,不要要求同时在两个数据库中都有记录。

我认为您需要自己加入—您当前的查询将永远不会产生任何结果

尝试这样的方法来获取在你的WHERE准则中多次出现的标签-但是,你是否在你的第二个位置遗漏了一些准则?此示例使用了您上面的示例:

SELECT DISTINCT t.tag_ID
FROM tag_blink_history t
   JOIN tag_blink_history t2 ON t.tag_ID = t2.tag_ID AND (t.x_location <> t2.x_location OR t.y_location <> t2.y_location)
WHERE (t.LOCATE_TIME > '2013-01-29 11:05:51' 
      AND t.LOCATE_TIME < '2013-01-29 11:06:56' 
      AND ((t.y_location*3.28 > 61) AND (t.y_location*3.28 < 67.5)) 
      AND ((t.x_location*3.28 > 14.5) AND (t.x_location*3.28 < 17.5)))
      AND (((t2.y_location*3.28 > 70) AND (t2.y_location*3.28 < 75)) 
      AND t2.locate_time < '2013-01-29 11:06:50' )
ORDER BY t.tag_id DESC

祝您好运。

您可以使用以下几种方法之一:

SELECT tag_ID, min(X_location*3.28), max(X_location*3.28), min(Y_location*3.28), max(Y_location*3.28), min(locate_time), max(locate_time)
FROM tag_blink_history
WHERE 
     (LOCATE_TIME > '2013-01-29 11:05:51' 
     AND LOCATE_TIME < '2013-01-29 11:06:56' 
     AND ((y_location*3.28 > 61) 
     AND (y_location*3.28 < 67.5)) 
     AND ((x_location*3.28 > 14.5) 
     AND (x_location*3.28 < 17.5)))
     AND (((y_location*3.28 > 70) 
     AND (y_location*3.28 < 75)) 
     AND locate_time < '2013-01-29 11:06:50' )
GROUP BY
   tag_ID
HAVING
   (min(X_location) <> max(X_location))
   OR
   (min(Y_location) <> max(Y_location))
ORDER BY tag_id DESC

@上述SGEDES自连接方法也很好;您也可以查看派生表。

我可以帮助您,但首先,您如何知道在查询的第二部分中找到的项与第一部分中的项相同??您如何知道查询的时间/位置?您使用的是哪种DBMS?神谕Posgres?我有一个物理传感器,可以检测物品在空间中的存在和离开。这就是我用来建立已知物理位置的方法。我正在使用SQLYOG来做这件事。谢谢,我将尝试一下@sgeddes对于第二个位置,我想如果它们位于物品进入范围之前的某个时间,我有一个直线传感器光束,它可以检测是否存在,并在它之前的区域留下一个字段-&作为一个有效的标准。我得到了22个标签,这是我所期望的。谢谢。我认为这是一个正确的轨道,但我想我需要两个绑定框来选择只移动标签?按原样执行上面的查询不会产生任何结果,输入mini和max范围也不会产生任何结果。我只是不确定操作聚合的概念乍一看使用了什么,但将对其进行研究。谢谢你的回答。