我正在审核一个查询,该查询应该根据 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语句总会返回相同的结果吗?
答案 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