2013-05-23 30 views

cevap

19

MySQL documentation bu konuda oldukça net:

Genel bir kural olarak, bir kullanıcı değişkeni bir değer atamak ve aynı deyimi içinde değerini okumak asla. Beklediğiniz sonuçlarını alabilirsiniz, ancak bu garanti edilmez. Kullanıcı değişkenlerini içeren ifadeler için değerlendirmesinin sırası tanımsızdır ve , belirli bir ifade içinde yer alan öğelere göre değişebilir; Ayrıca, bu siparişin MySQL Sunucusunun sürümleri ile aynı olması garanti edilemez. SELECT @a, @a: = @ a + 1, ..., , MySQL'in önce @a'yı değerlendireceğini ve daha sonra no'lu bir atamayı yapacağını düşünebilirsiniz. Ancak, deyimin değiştirilmesi (örneğin, GROUP BY, HAVING veya ORDER BY cümlesi ekleyerek), MySQL'in farklı bir değerlendirme sırası ile bir yürütme planı seçmesine neden olabilir.

Sen bir alt sorgu kullanarak istediğiniz ne yapabilirim: mysql

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

Sorgu oldukça karmaşık bir yapı olduğundan, artık alt sorgular eklemek istemiyorum. Ve neden prosedürlerle çalışıyor? Prosedürde bir değişken kullanmak, prosedürü iki kez kullanmaktan çok daha hızlıdır. Yani sadece anlamadım, neden bu bir miktar (madde) ile birlikte çalışmamalıdır. – user2370579

+0

Ancak alt seçim, seçim ifadesinin bir parçası olduğundan, öneriniz de tanımlanmamıştır. – philipxy

+0

@philipxy. . . Alt sorgu, dış sorgudan önce çalıştırılır, bu nedenle sipariş tanımlanır. –

4

Çalışır Ben sarma inanıyorum 5,5

select @code:=sum(2), 2*@code 

+---------------+---------+ 
| @code:=sum(2) | 2*@code | 
+---------------+---------+ 
|    2 |  4 | 
+---------------+---------+ 
+7

Hayır, bu MySQL 5.6 ayarımda çalışmıyor; ikinci sütun ilk girişte 'NULL' verir ve bir önceki sonucu * 2 kez döndürür. Şimdi, yeterince ilginç, her ikisi de 'select @code: = 2, 2 * @ code' ve 'select @code: = rand(), 2 * @ kodu;' * * aynı kurulumda (bugün) çalışır. Bu nedenle, belgelerin (bkz. Gordon'un cevabı) göz önüne alındığında, tanımlanmış bazı sonuçlara dönmek için buna güvenmem. – Arjan

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

2*@zif açıklamada sum sağlayacaktır ek hesaplama ÖNCE yapılır.

+2

Aynı hesabı "@ z" kullanıldığı yerlerde yapıyorsanız, '@ z 'a atanma noktası nedir ?! –