2013-07-30 4 views
7

私は、どこに属しているかによってクエリを除外しようとしているMySQLのステートメントを持っています。クエリは実行されますが、MySQL - どこですか?

SELECT id, belongsto, title, madeby, sticky, locked, lastpost, posts 
FROM threads 
WHERE sticky !=1 
AND belongsto !=12 OR sticky !=1 AND belongsto !=13 
ORDER BY `threads`.`date` DESC 
LIMIT 20 
+0

あなたは本当に両方の上に 'sticky!= 1'の同じ基準を繰り返すので、あなたは本当に' OR'を必要としません。 –

+0

"OR sticky!= 1'"をクエリから削除するだけで問題を解決できます。 「OR」条件は、12の値が一方の側を満たし、13の値が他方の側を満たすようにしているので、それらの値は「除外」されない。 – spencer7593

答えて

23

あなたは論理的にグループにそれらをあなたのOR文の周りに括弧が必要です。

WHERE sticky !=1 
AND belongsto !=12 OR sticky !=1 AND belongsto !=13 

は次のようになります。まだ

WHERE (sticky !=1 AND belongsto !=12) 
OR (sticky !=1 AND belongsto !=13) 

以上:

WHERE sticky !=1 AND belongsto NOT IN(12,13) 
+0

は属していません(12,13,14)、それはすごく素晴らしいです:)ありがとう。完璧に動作します。 –

+2

括弧は必要ありません。 'AND'演算子は' OR'演算子よりも高い優先度を持ちます。 ( "should be:"の下に示されているように)括弧を追加しても、文は変更されません。これで問題は解決されません。 「より良い」の下に書き直すと、このステートメントが変更されます。 – spencer7593

+0

行く方法は 'NOT IN()'です。ありがとうございます – RozzA

2

目標は1213のbelongsToの値を持つ行を除外することであれば、ORがあるべきAND

カッコが「見つからない」ため追加する必要があるというアサーション(選択した回答)は間違っています。括弧を追加しても、ステートメントの変更は変わりません。 ANDオペレータは、すでにOR演算子よりも優先順位が高い)

WHERE sticky !=1 
AND belongsto !=12 AND sticky !=1 AND belongsto !=13 
        ^^^ 

を、それが二度同じ述語を繰り返す不要なので、これはのように書き直すことができます。

のように書くこともできる
WHERE sticky !=1 
AND belongsto !=12 AND belongsto !=13 

WHERE sticky !=1 
    AND NOT (belongsto =12 OR belongsto =13) 

また、これは、(選択された回答に示されているように)NOT IN (12,13)を用いて書き換えることができます。 。

関連する問題