【问题标题】:Combining multiple OR operators with an AND operator将多个 OR 运算符与 AND 运算符组合
【发布时间】:2015-12-28 07:24:41
【问题描述】:

我在编写一个有多个 OR 运算符后跟 AND 运算符的查询时遇到了一些困难。

目前,我的查询如下:

SELECT * FROM `contentvalues` WHERE (`contentid` = 16 OR `contentid` = 18) AND `value` <= 180;

但是,产生的结果似乎表明 AND 运算符:

AND `value` <= 180;

正在被忽略。

有人知道我做错了什么吗?

--更多信息--

我正在查询的表示例如下:

  • contentid价值
  • 16, 200
  • 18, 150
  • 47, 120
  • 16, 110

预期结果应该是18, 15016, 110,但16, 200 也包括在内,即使200 大于180

编辑:

对不起,上面的问题是错误的 - 我试图删除但不能,因为它已经有问题了。

问题不是查询,而是values 列中的一些值是字符串。无论查询中的数字是多少,这些都会显示。

【问题讨论】:

  • 你描述的问题不是reproducibleWHERE 子句的谓词似乎完全符合您的要求。
  • 我想你打错了:预期结果应该是18, 250。我想你的意思是18, 150
  • @EdwinStoteler 是的,谢谢
  • @GiorgosBetsos 是的,我刚刚意识到我的问题写得不好。我试图删除但不能,因为它有答案。
  • 其实可以删除。我认为只有在接受答案时才会禁用删除。

标签: sql mysqli operators


【解决方案1】:

您将 or 逻辑用于 SQL in 子句中的同一变量。

这样试试

SELECT * FROM `contentvalues` WHERE contentid in (16,18) AND value <= 180;

【讨论】:

  • 这相当于 OP 的 WHERE 子句。它不应该产生不同的结果。
【解决方案2】:

你得到的结果是正确的。我猜您对查询的实际执行方式感到困惑。所以你的查询是:

SELECT * FROM `contentvalues` WHERE (`contentid` = 16 OR `contentid` = 18) AND `value` <= 180;

这就像拿了

`contentid` = 16 AND `value` <= 180   //gives 16, 110

联合

OR `contentid` = 18 AND `value` <= 180   //gives 18, 150

所以预期的结果是正确的。

但 16、200 也包括在内,即使 200 大于 180。

没有被忽略,只是不满足where子句条件。

【讨论】:

    【解决方案3】:

    如果列中的值是字符串,那么您可以使用
    SELECT * FROM contentvalues WHERE contentid in (16,18) AND 转换(值,有符号整数)

    【讨论】:

      猜你喜欢
      • 2014-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      • 2020-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多