15

我有一个 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
4

2 回答 2

34

您需要在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)
于 2013-07-30T17:30:13.223 回答
3

如果目标是排除属于 和 值的行,12则应13OR替换为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)

这也可以使用 a 重写NOT IN (12,13)(如所选答案所示)。

于 2013-07-30T18:04:29.987 回答