0

注文を選択するためのクエリがあり、2つの日付から選択したいと思います。ただし、ステータスが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注文を変更した場合、完全に無視されます。BETWEENOR'1322884800'

注文ステータスが4(または3、または2、または1)のいずれかであるXとYの間の注文を選択するには、どこに配置する必要がありますか、またはこれをどのように行うことができますか?

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' 

これは、日付に関係なく、最後の3つの注文ステータスのいずれかが見つかった場合にtrueと評価されます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 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 に答える
0

また

SELECT * 
WHERE created >= '1296360000' 
AND created <= '1322884800' 
AND order_status in ("pending", "processing", "payment_received", "completed")
于 2012-10-03T20:13:32.763 に答える