0

我有一个选择订单的查询,我想在两个日期之间进行选择。但我也想选择所有处于 3 或 4 种状态之一的订单。我有以下

SELECT *
WHERE  created BETWEEN '1296360000' AND '1322884800'
       AND order_status = 'pending'
        OR order_status = 'processing'
        OR order_status = 'payment_received'
        OR order_status = 'completed' 

但问题是它似乎选择了订单状态为这 4 个之一的所有内容。并且完全忽略了BETWEEN如果我将订单状态更改为BETWEEN在订单状态之后OR它仍然包括在'1322884800'

我应该在哪里放置中间值或如何执行此操作以在 X 和 Y 之间选择订单状态为 4(或 3、或 2 或 1)个值之一的订单?

4

7 回答 7

2

order_status子句放在括号中(或者更好的是,使用 IN 列表)。

SELECT *
WHERE  created BETWEEN '1296360000' AND '1322884800'
       AND (order_status = 'pending'
        OR order_status = 'processing'
        OR order_status = 'payment_received'
        OR order_status = 'completed')

按照您现在的方式,优先级被解释为:

SELECT *
WHERE  (created BETWEEN '1296360000' AND '1322884800'
       AND order_status = 'pending')
        OR order_status = 'processing'
        OR order_status = 'payment_received'
        OR order_status = 'completed' 

如果找到最后三个订单状态中的任何一个,这将评估为真,无论created日期如何。

于 2012-10-03T20:01:25.920 回答
2
SELECT *
WHERE
    created BETWEEN '1296360000' AND '1322884800' AND
    order_status IN ('pending', 'processing', 'payment_received', 'completed')
于 2012-10-03T20:01:46.947 回答
1

这是一个优先问题:

SELECT *
WHERE  created BETWEEN '1296360000' AND '1322884800'
   AND (order_status = 'pending'
    OR order_status = 'processing'
    OR order_status = 'payment_received'
    OR order_status = 'completed')

OR 语句没有按照您期望的顺序进行评估 - 在 OR 部分周围放置括号以确保它们被正确评估。你也可以这样做:

SELECT *
WHERE  created BETWEEN '1296360000' AND '1322884800'
   AND order_status IN ('pending','processing','payment_received','completed')

哪个更整洁。

于 2012-10-03T20:00:58.040 回答
1

您需要封装 OR。或者使用这样的东西:

SELECT * WHERE created BETWEEN '1296360000' AND '1322884800' AND order_status IN ('pending', 'processing','payment_received', 'completed')

注意,不检查正确性。

于 2012-10-03T20:01:31.957 回答
0

或者

SELECT * 
WHERE created >= '1296360000' 
AND created <= '1322884800' 
AND order_status in ("pending", "processing", "payment_received", "completed")
于 2012-10-03T20:13:32.763 回答
0
SELECT *
WHERE  created BETWEEN '1296360000' AND '1322884800'
       AND ( order_status = 'pending'
        OR order_status = 'processing'
        OR order_status = 'payment_received'
        OR order_status = 'completed' )
于 2012-10-03T20:03:42.870 回答
0

您需要使用方括号明确定义优先级:

 SELECT *
 WHERE  created BETWEEN '1296360000' AND '1322884800'
   AND ( order_status = 'pending'
    OR order_status = 'processing'
    OR order_status = 'payment_received'
    OR order_status = 'completed') 
于 2012-10-03T20:03:45.137 回答