2012-10-03 34 views
0

我有一個查詢選擇訂單,我想選擇兩個日期之間。但我也想選擇所有3或4個狀態之一的訂單。我有以下MySQL之間和或?

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'

我應該在哪裏放置或如何做到這一點,以選擇訂單狀態爲4(或3,或2,或1)價值(S)?

回答

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日期。

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') 

的或說明都沒有在你所期望的順序進行評估 - 把周圍的或部分支架,以確保他們正確的評估。你也可以這樣做:

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

這是一個小整理。

1

您需要封裝OR。或使用類似這樣:

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

注意,不是檢查正確性。

2
SELECT * 
WHERE 
    created BETWEEN '1296360000' AND '1322884800' AND 
    order_status IN ('pending', 'processing', 'payment_received', 'completed') 
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') 
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') 
0

SELECT * 
WHERE created >= '1296360000' 
AND created <= '1322884800' 
AND order_status in ("pending", "processing", "payment_received", "completed")