Назначения для переменных сеанса не работают внутри предложения ON
.
Причина, по которой вы видите увеличение @foo для INNER JOIN, заключается в том, что оптимизатор выполняет ваш запрос как:
SET @foo:=0;
SELECT @foo
FROM test t1
JOIN test t2
WHERE t2.id=t1.id AND (@foo:=@foo+1);
Используя EXPLAIN SELECT...
, вы должны увидеть using where
в дополнительном столбце.
Вы также можете использовать EXPLAIN EXTENDED SELECT...
, а затем SHOW WARNINGS
, чтобы увидеть, как именно оптимизатор выполняет ваш запрос.
В вашем случае запрос LEFT JOIN
выполняется точно так, как он написан, поскольку для этого типа объединения вы можете получить разные результаты для одного и того же условия в ON
и WHERE
.
Если вы хотите увеличить @foo для LEFT JOIN
, используйте:
SET @foo:=0;
SELECT @foo
FROM test t1
LEFT JOIN test t2 ON t2.id=t1.id
WHERE @foo:=@foo+1