Ваш запрос выводит значения переменной @foo. В первом случае ее значение всегда равно 0 и не изменяется, поэтому выводятся нули. Во втором случае при обработке каждой строки выполняется проверка условия, а в нем стоит присвоение нового значения переменной @foo. Поэтому в каждой следующей строке значение @foo становится на единицу больше.
Переменная foo здесь в условии как раз для того, чтобы проверить выполняется ли условие или нет. В первом случае плдучается что Mysql игнорирует правую часть AND, во втором нет
Да нет. Мне это не нужно. Вопрос в том, почему в принципе Mysql не выполняет AND(@foo:=@foo+1) в первом случае. Причем результаты выборки в двух случаях абсолютно одинаковые, отличаются только тем что в первом случае @foo не инкрементируется
хм, если написать select @foo, t2.id … and @foo := 5, то результат будет
0 null
0 null
… …
5 1
5 2 и т.д.
Т.е. в принципе значение присваивается.
Если просто указать and @foo, когда foo равен нулю (=false), все джоины будут null, т.е. условие выполняется.
Значит, @foo:=@foo+1 в каждой строке в принципе срабатывает (сводится к true), но значение переменной уже не сохраняется
Одновременное чтение и присвоение переменной в рамках одного запроса не рекомендуется, в мануале это (весьма мягко) описано. Всё ещё веселее, может срабатывать даже выражение вроде @a>0 and @a<0