MySQL - WHERE 子句中的多个等价项

MySQL - Multiple equivalencies in WHERE clause

我想知道 MySQL 中的以下两个 WHERE 子句是否有区别:

WHERE a.Id = b.Id = c.Id

对比

WHERE a.Id = b.Id and b.Id = c.Id

我在以下 SQLFiddle 中得到这两个查询的不同结果:http://sqlfiddle.com/#!2/725396/3

我认为区别在于第一个 WHERE 所有三个 id 必须相等,而在后者 a.id 应该等于 b.id 而 b.id 应该等于c.id 但这并不意味着 a.id 应该等于 c.id.

根据 MySQL doco for an expression,您的表达式 a = b = c 使用 boolean_primary 的以下形式:

comparison_operator: = | >= | > | <= | < | <> | !=
boolean_primary:
    boolean_primary comparison_operator predicate

因此等同于:

(a = b) = c

这意味着您将从 a = b 中得到一个 truth 值,然后将 thatc 进行比较.

在 MySQL 中,boolean 类型为 equivalent to tinyint(1),其中 0 为假,其他均为真。因此它只是一个整数值,可以与另一个值进行比较。

进一步比较的结果表达式a = bwill always return0为假,1为真,如果任何输入为 NULL,则为 NULL。

因此,要使表达式a = b = c为真,其中none个允许为NULL,且下列其中一项必须为真:

  • a等于bc等于1;或
  • a不等于bc等于0.

这几乎肯定不是你想要的,正确的形式是第二个。