我有一个 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
您需要在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)
如果目标是排除属于 和 值的行,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)
这也可以使用 a 重写NOT IN (12,13)
(如所选答案所示)。