2017-02-08 7 views
2

次のクエリを使用してmysqlデータベースからデータを取得していますが、間違ったデータを取得しています。私は1のview_Statusを持っている2または3のcart_Statusですべてのデータを取得したい:mysqlクエリはwhere句で間違ったデータを返します

SELECT * FROM `cart` WHERE `view_Status` = 1 AND cart_Status = 2 OR `cart_Status` = 3 

これは私のデータ構造とテーブルがどのように見えるかです:

enter image description here

しかし結果で私の目標ではないview_Status = 1に関係なく何かを返します。

それが返されます。

enter image description here

もちろん、それが何を返すべきではありません!しかし、そうです!

+1

は、SELECT 'これを試してみてください* WHERE' cart' FROM 'view_Status' = 1 AND(cart_Status = 2 OR' cart_Status' = 3) ' –

答えて

3

これはオペレータの優先順位に関するものです。

SELECT * FROM `cart` WHERE `view_Status` = 1 AND (cart_Status = 2 OR `cart_Status` = 3) 
+1

おっと!私はそれを忘れてしまった。ありがとう:-) – Afshin

+2

任意のプログラミング言語でオペレータの優先順位と呼ばれます。 – TheHe

1

あなたがSQLを学習するように見える:あなたは括弧を追加する必要があります

SELECT * FROM `cart` WHERE (`view_Status` = 1 AND cart_Status = 2) OR `cart_Status` = 3 

として
あなたのクエリが評価されます。特に ANDORを混ぜて使用する場合は、 WHERE句にかっこを使用します。

SELECT c.* 
FROM `cart` c 
WHERE c.view_Status = 1 AND cart_Status IN (2, 3); 
1

それは演算子の優先順位に問題があります:

しかし、あなたのケースでは、INは、よりよい解決策です。通常、ANDは、プログラミング言語でORより前に実行されます(ビットの乗算ではAND、ビットの追加ではORのように思えます)。だから、あなたの条件:

`view_Status` = 1 AND cart_Status = 2 OR `cart_Status` = 3 

は次のように解析されます。特定のcart_Statusを持つすべての行になり

(`view_Status` = 1 AND cart_Status = 2) OR `cart_Status` = 3 

を選択します。あなたは第二節の周りに括弧を追加する必要があります。

`view_Status` = 1 AND (cart_Status = 2 OR `cart_Status` = 3) 

や、さらに短い:

`view_Status` = 1 AND cart_Status IN (2, 3) 
2
SELECT * FROM `cart` WHERE `view_Status` = 1 AND (cart_Status = 2 OR `cart_Status` = 3) 

またはより良い

SELECT * FROM `cart` WHERE `view_Status` = 1 AND cart_Status in (2, 3); 
関連する問題