选择符合SQL中两个条件的项目

时间:2013-01-29 17:39:54

标签: sql data-processing sqlyog

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

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

所以我有这个问题:

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是同时出现在两个地方的东西(这是不可能发生的),但我想要的是存在于这两个空间约束中的记录 - 我想要记录它们在两者中的时间,而不是要求同时记录两份记录。

2 个答案:

答案 0 :(得分:2)

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

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

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
祝你好运。

答案 1 :(得分:1)

您可以使用聚合(多种方法之一):

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
上面的@sgeddes自我加入方式也不错;你也可以查看派生表。