【问题标题】:MySQL - Where Or?MySQL - 在哪里?
【发布时间】:2013-07-30 23:37:52
【问题描述】:

我有一个 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,因为您在两者上都重复sticky !=1 的相同标准。
  • 从查询中删除“OR sticky !=1”就足以解决问题。 OR 条件使得值 12 将满足一侧,值 13 将满足另一侧,因此这些值不会被“排除”。

标签: mysql sql where


【解决方案1】:

您需要在 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)

【讨论】:

  • 属于 NOT IN(12,13,14),这太棒了 :) 谢谢。完美运行。
  • “不需要”括号。 AND 运算符的优先级高于 OR 运算符;添加括号(如“应该是:”下所示)不会改变语句;这并不能解决问题。 “更好”下的重写确实改变了陈述。
【解决方案2】:

如果目标是排除属于值为1213 的行,则应将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) 重写(如所选答案所示)。

【讨论】:

    猜你喜欢
    • 2012-04-01
    • 2020-10-06
    • 2011-06-01
    • 2015-05-14
    • 1970-01-01
    • 2014-02-02
    • 1970-01-01
    • 2013-08-05
    • 2012-07-26
    相关资源
    最近更新 更多