2

うまくいかないクエリがあります。単一の IN ステートメントを使用して問題を修正しました (クエリを作成するために使用しているライブラリが原因でした) が、なぜこれが起こるのかまだ知りません。

クエリは次のとおりです。

SELECT * FROM (`table`) 
WHERE     `field` = 'false' 
      AND `something` LIKE '%string%' 
      AND `status_id` IN ('1') 
      OR `status_id` IN ('2') 
      OR `status_id` IN ('3') 

私へのクエリは理にかなっています:フィールド= falseで、何かが文字列のようなテーブルからすべてを選択し、ステータスIDが1にある、ステータスIDが2にある、またはステータスIDが3にある

複数の IN ステートメントがある場合、クエリの LIKE 部分は完全に無視されます。

複数の IN ステートメントが原因で LIKE が無視される理由はありますか? 理由がわかりません: クエリを再配置しても影響はありません (LIKE を最後と最初に移動します)

4

2 に答える 2

5

優先?ANDとORを区別するために角かっこを使用するべきではありませんか?status_idIN('x')は、trueの場合、式の残りの部分を無視します。

SELECT * FROM (`table`) 
WHERE     `field` = 'false' 
      AND `something` LIKE '%string%' 
      AND (`status_id` IN ('1') 
            OR `status_id` IN ('2') 
            OR `status_id` IN ('3') 
      )

これはと同じです

SELECT * FROM (`table`) 
WHERE     `field` = 'false' 
      AND `something` LIKE '%string%' 
      AND `status_id` IN ('1', '2', '3')

これで何が出てくるか見て、自分で試してみてください。

SELECT * FROM (`table`) 
WHERE     `field` = 'false' 
      AND `something` LIKE '%string%' 
      AND `status_id` IN ('1') 
      OR 1=1    

このクエリが何を返すかを自問してください

于 2012-07-28T02:12:12.283 に答える
1

MySQL を含むほとんどの言語では、and演算子はor. したがって、あなたのコードは

WHERE ( field = 'false' AND something LIKE '%string%' AND status_id IN ('1') )
OR status_id IN ('2') 
OR status_id IN ('3')

修正は明らかに、3 つのIN条件の前後に括弧を使用することです。

WHERE field = 'false'
AND something LIKE '%string%'
AND ( status_id IN ('1') OR status_id IN ('2')  OR status_id IN ('3') )
于 2012-07-28T02:21:23.143 に答える