MySQL tài liệu khá rõ ràng về điều này:
Theo nguyên tắc chung, bạn không bao giờ được gán giá trị cho biến người dùng và đọc giá trị trong cùng một câu lệnh. Bạn có thể nhận được kết quả như mong đợi, nhưng điều này không được đảm bảo. Thứ tự đánh giá cho các biểu thức liên quan đến biến người dùng là không xác định và có thể thay đổi dựa trên các phần tử có trong một câu lệnh nhất định; ngoài ra, thứ tự này không được đảm bảo là giống nhau giữa các bản phát hành của Máy chủ MySQL. Trong SELECT @a, @a: [email protected] +1, ..., bạn có thể nghĩ rằng MySQL sẽ đánh giá @a trước và sau đó thực hiện một phân công thứ hai. Tuy nhiên, việc thay đổi câu lệnh (ví dụ:bằng cách thêm mệnh đề aGROUP BY, HAVING hoặc ORDER BY) có thể khiến MySQL chọn kế hoạch thực thi lại với thứ tự đánh giá khác.
Bạn có thể làm những gì bạn muốn bằng cách sử dụng truy vấn con:
select @z, @z*2
from (SELECT @z:=sum(item)
FROM TableA
) t;