Из-за того, что mysql является декларативным языком, я не могу найти способ форсировать порядок присваивания переменных.
Возьмите этот запрос:
SET @v1=0;
SET @v2=0;
SELECT @v1, @v2
FROM MyTable table
WHERE (@v1:=@v2) is not null
AND (@v2:=2) is not null;
Результат:
@v1 | @v2
---------
2 | 2
Это потому, что @v2 анализируется до @ v1 механизмом mysql.
Как заставить порядок назначения получить такой результат:
@v1 | @v2
---------
0 | 2
РЕДАКТИРОВАТЬ: это не тот же вопрос, что и: присваивание переменной с mysql
Вот вопрос о том, чтобы форсировать порядок присвоения, а не о том, почему результат не является ожидаемым.
ОБНОВЛЕНИЕ:
когда вы используете левое внешнее соединение, результат также странный:
SET @v1=0;
SELECT @v1
FROM Account other
LEFT OUTER JOIN SimpleValue f_PC ON f_PC.accountId=other.id AND f_PC.refShortcut='PC'
WHERE CASE WHEN (other.context='44') THEN (@v1:=@v1+1) ELSE null END
ORDER BY @v1 ASC
В этом случае запрос возвращает 60 результатов, но значение @ v1 равно 120.
Если я удаляю левое внешнее соединение, значение v1 равно 60. Почему?