为什么这个“where”子句不限制sql结果

时间:2014-01-15 15:05:41

标签: mysql sql select operator-precedence

我正在尝试将表格中的结果限制为日期与我的数据不重叠的记录。正如您在下面的屏幕截图中看到的,我正在尝试添加一个子句来过滤掉等于“end”列的记录。请参阅查询中的最后一行。

我无法弄清楚为什么结果仍会显示截图中的记录。有人可以帮我解释一下吗?这可能是一种语法问题?

谢谢!

SQL Where clause not filtering

4 个答案:

答案 0 :(得分:5)

你基本上有:

a OR b AND c AND d AND e AND f

......你可能想要:

(a OR b) AND c AND d AND e AND f

参考:Operator Precedence

答案 1 :(得分:2)

AND的{​​{3}}高于OR

这意味着您的AND条款将首先被解释,以便最后有类似

的内容
where (...) or (... and ... and ...)

由于满足OR('2014-01-14 18:30:00' between start and end))之前的第一个条件,您的行就会显示出来。将OR子句的两边放在parantheses中,它应该按照你想要的方式工作。

答案 2 :(得分:1)

问题是你的WHERE子句的第一部分是传递该记录。我相信你需要更多的括号。

我不完全确定您使用所提供的数据尝试实现的目标,但是OR关键字后面的左括号和最后一个结束括号应该这样做。

像这样:

where
('2014-01-14 18:30:00' between start and end)
or (('2014-01-14 19:30:00' between start and end)
and ('2014-01-14 18:30:00' != start)
and ('2014-01-14 19:30:00' != end)
and ('2014-01-14 19:30:00' != start)
and ('2014-01-14 18:30:00' != end))

答案 3 :(得分:1)

因为2014-01-14 18:30介于2014-01-14 16:002014-01-14 18:30之间,这是 TRUE 条件。并且[(TRUE)或(其他任何)]也是 TRUE