2013-07-30 77 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

你根本不需要'OR',因爲你對'sticky!= 1'重複同樣的標準。 –

+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'運算符具有更高的優先級;括號(如「應該是:」所示)的添加不會改變語句;這不能解決問題。 「更好」的改寫確實改變了陳述。 – spencer7593

+0

要走的路是'NOT IN()',當然,謝謝 – RozzA

2

如果目標是排除與和12屬於關聯值13,那麼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)(如示所選擇的回答) 。