MySQL – Defina una variable dentro de select y úsela dentro de la misma selección

¿Hay alguna posibilidad de hacer algo como esto?

SELECT @z:=SUM(item), 2*@z FROM TableA; 

Siempre obtengo NULL para la segunda columna. Lo extraño es que mientras haces algo como

 SELECT @z:=someProcedure(item), 2*@z FROM TableA; 

todo funciona como se espera ¿Por qué?

La documentación de MySQL es bastante clara en esto:

Como regla general, nunca debe asignar un valor a una variable de usuario y leer el valor dentro de la misma instrucción. Puede obtener los resultados que espera, pero esto no está garantizado. El orden de evaluación para expresiones que involucran variables de usuario no está definido y puede cambiar en función de los elementos contenidos en una statement dada; Además, no se garantiza que este orden sea el mismo entre versiones del servidor MySQL. En SELECCIONAR @a, @a: = @ a + 1, …, podría pensar que MySQL evaluará @a primero y luego realizará una asignación en segundo lugar. Sin embargo, cambiar la instrucción (por ejemplo, al agregar una cláusula GROUP BY, HAVING u ORDER BY) puede hacer que MySQL seleccione un plan de ejecución con un orden diferente de evaluación.

Puedes hacer lo que quieras usando una subconsulta:

 select @z, @z*2 from (SELECT @z:=sum(item) FROM TableA ) t; 

Funciona en mysql 5.5

 select @code:=sum(2), 2*@code +---------------+---------+ | @code:=sum(2) | 2*@code | +---------------+---------+ | 2 | 4 | +---------------+---------+ 
 mysql> select @z := sum(5), if(@z := sum(5), 2*@z, 0) ; +--------------+------------------------------+ | @z := sum(5) | if(@z := sum(5), 2*@z, null) | +--------------+------------------------------+ | 5 | 10 | +--------------+------------------------------+ 

Creo que al ajustar el 2*@z en la statement if se asegurará de que la sum se realice ANTES del cálculo adicional.