2015-08-18 4 views
1

мне было интересно, если есть разница между следующими двумя WHERE пунктами в MySQL:MySQL - Несколько Эквиваленты в ИНЕКЕ

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

против

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

Я получаю разные результаты для них два запроса в следующем SQLFiddle: http://sqlfiddle.com/#!2/725396/3

+0

Вместо этого используйте 'Inner Join' – RubahMalam

+0

Хммм, почему это исправить? – Zhouster

+0

Я этого раньше не видел. Вы уверены, что это не просто оценка одной из этих эквивалентов и применение ее как Intoolean к следующему? (Хорошо, да, я просто использовал термин. Я имею в виду логический, который впоследствии интерпретируется как целое число со значением 0 или 1.) Или это действительно допустимый синтаксис в MySQL? –

ответ

4

Согласно MySQL doco for an expression, ваше выражение a = b = c использует следующую форму: boolean_primary

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

и поэтому эквивалентно:

(a = b) = c 

Это означает, что вы получите значение в правда от a = b, а затем сравнить , что с c.

В MySQL тип boolean равен equivalent to tinyint(1), где 0 является ложным, а все остальное является истинным. Следовательно, это просто интегральное значение, которое можно сравнить с другим.

Далее, результат сравнения экспрессии как a = bwill always return0 для ложной, 1 для истинно, или NULL, если любой входной NULL.

Поэтому для выражения a = b = c, чтобы быть правдой, ни один из них не могут быть NULL, и один из следующих должно быть правдой:

  • a равно b и c равно 1 ; или
  • a не соответствует b и c равен 0.

Это почти наверняка не то, что вы хотите, правильная форма является второй.

+0

Это действительно то, что происходит, и вот [скрипка, чтобы доказать это] (http://sqlfiddle.com/#!2/95b63/2) –

+0

Вау, это имеет смысл. Благодаря! – Zhouster

0

Я думаю, что разница в том, что в первом ГДЕ все три идентификатора должны быть равны, wh ereas в последнем a.id должны быть равны b.id и b.id должны быть равны c.id, но это не означает, что a.id должен быть равен c.id.

+0

В том, что вселенная выполняет 'a = b' и' b = c', но 'a! = C'? :-) – paxdiablo

+0

) есть. не имеет смысла. – SergeyAn

Смежные вопросы