mysql OR / AND - 操作顺序如何工作

时间:2014-08-19 20:40:45

标签: mysql sql database

我正在审核一个查询,该查询应该根据 created_at 日期或 returned_at 日期在一个月内提取交易列表。

SELECT * 
FROM (`transaction`) 
WHERE `created_at` >= '2014-08-01' 
AND `created_at` <= '2014-08-31' 
OR `returned_at` >= '2014-08-01' 
AND `returned_at` <= '2014-08-31'

我最初的想法是,这不会按预期工作,因为我们在分组WHERE逻辑周围没有括号。换句话说,它会一个接一个地评估每个条件。

这就是我编写语句以确保操作顺序的方法(我添加了括号):

SELECT * 
FROM (`transaction`) 
WHERE 
  (`created_at` >= '2014-08-01' AND `created_at` <= '2014-08-31')
OR 
  (`returned_at` >= '2014-08-01' AND `returned_at` <= '2014-08-31')

奇怪的是,初始查询似乎正在工作,但我不确定它是否因为我的数据集。有人可以澄清两个sql语句总会返回相同的结果吗?

3 个答案:

答案 0 :(得分:1)

明确地写它总是一个好主意,但是,AND comes before OR

为了您的乐趣,请明确地为您检查:

$ php -r '$d = 0; while($d < pow(2,4)){$bin = sprintf("%04b",$d); echo $bin." => ".@mysql_result(mysql_query("SELECT ".$bin[0]." AND ".$bin[1]." OR ".$bin[2]." AND ".$bin[3]),0,0).PHP_EOL;$d++;}'
0000 => 0
0001 => 0
0010 => 0
0011 => 1
0100 => 0
0101 => 0
0110 => 0
0111 => 1
1000 => 0
1001 => 0
1010 => 0
1011 => 1
1100 => 1
1101 => 1
1110 => 1
1111 => 1

所以是的,运营商优先权和所有。如果只是下一个人很难看到它的作用,我仍会抛出那个问题。

答案 1 :(得分:0)

根据您的数据,两个查询可能会返回相同的数据。 OR操作数将与其他AND操作数冲突,因为每个操作数的优先级。

第二个查询是一种方法,但您可以在之间使用:

SELECT * FROM (`transaction`) 
WHERE (`created_at` BETWEEN '2014-08-01' AND '2014-08-31') 
   OR (`returned_at` BETWEEN '2014-08-01' AND '2014-08-31')

答案 2 :(得分:-1)

其运算符优先级。保证在OR之前评估AND