Perché questo FROM (SELECT @foo AS foo)
viene valutato prima di questo @foo := 1
. Fondamentalmente qualsiasi cosa in FROM verrà valutata prima di SELECT.
In realtà dovrebbe essere nullo, ma suppongo che tu abbia assegnato alla tua variabile di sessione un valore pari a zero da qualche altra parte.