Parce que ce FROM (SELECT @foo AS foo)
est évalué avant ce @foo := 1
. Fondamentalement, tout ce qui se trouve dans FROM sera évalué avant votre SELECT.
Il devrait en fait être nul, mais je suppose que vous avez attribué à votre variable de session une valeur de zéro ailleurs.