2013-05-23 11 views
16

क्या ऐसा कुछ करने की संभावना है?MySQL - चयन के भीतर एक चर परिभाषित करें और इसे उसी चयन के भीतर उपयोग करें

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

मुझे हमेशा दूसरे कॉलम के लिए न्यूल मिलता है। अजीब चीज यह है कि

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

कुछ ऐसा करने के दौरान काम करता है। क्यूं कर?

+1

मुझे बहुत उम्मीद है कि @ @z: = कुछ प्रसंस्करण (आइटम), 2 * @ z' ऊपर काम कर रहा है बस एक खुश संयोग है। – Arjan

उत्तर

19

MySQL documentation इस पर काफी स्पष्ट है:

एक सामान्य नियम के रूप में, आप एक उपयोगकर्ता चर को कोई मान निर्दिष्ट नहीं किया जाना चाहिए और एक ही कथन में मूल्य पढ़ें। आपको परिणाम मिल सकते हैं, लेकिन इसकी गारंटी नहीं है। उपयोगकर्ता चर से जुड़े अभिव्यक्तियों के लिए का मूल्यांकन अपरिभाषित है और किसी दिए गए कथन में मौजूद तत्वों के आधार पर बदल सकता है; इसके अलावा, यह आदेश MySQL सर्वर के रिलीज़ के बीच समान होने की गारंटी नहीं है। SELECT @ ए, @ ए: = @ ए + 1, ... में, आप सोच सकते हैं कि MySQL पहले @a का मूल्यांकन करेगा और फिर दूसरा असाइनमेंट करेगा। हालांकि, कथन बदलना (उदाहरण के लिए, ग्रुप बाय, हैविंग, या क्लॉज द्वारा ऑर्डर जोड़कर) MySQL को मूल्यांकन के एक अलग क्रम के साथ निष्पादन योजना का चयन करने का कारण बन सकता है।

आप क्या आप एक सबक्वेरी का उपयोग कर करना चाहते हैं कर सकते हैं:

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

क्वेरी एक जटिल है, इसलिए मैं अब और सबकुरी जोड़ना नहीं चाहता हूं। और यह प्रक्रियाओं के साथ क्यों काम कर रहा है? प्रक्रिया पर एक चर का उपयोग प्रक्रिया को दो बार उपयोग करने से कहीं अधिक तेज़ है। इसलिए मुझे यह नहीं मिला, यह राशि (आइटम) के साथ भी क्यों काम नहीं करना चाहिए। – user2370579

+0

लेकिन उप-चयन चयन कथन का हिस्सा है, इसलिए आपका सुझाव भी अनिर्धारित है। – philipxy

+0

@philipxy। । । Subquery बाहरी क्वेरी से पहले चलाया जाता है, तो आदेश परिभाषित किया गया है। –

4

वर्क्स 5,5

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

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

नहीं, यह मेरे MySQL 5.6 सेटअप में काम नहीं करता है; दूसरा कॉलम पहले आमंत्रण पर 'NULL' उत्पन्न करता है, और पिछले परिणाम 2 बार * देता है * यदि फिर से चलाया जाता है, जो किसी को यह सोचने में मूर्ख बना सकता है कि यह काम करता है। अब, दिलचस्प है, दोनों 'चयन करें @code: = 2, 2 * @ code' और' select @code: = rand(), 2 * @ code; '* * एक ही स्थापना (आज) में काम करें। इसलिए, दस्तावेज दिया गया (गॉर्डन का जवाब देखें), मैं कुछ परिभाषित परिणाम वापस करने के लिए इस पर भरोसा नहीं करता। – 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 बयान में sum सुनिश्चित करेगा अतिरिक्त गणना से पहले किया जाता है।

+2

'@ z' को असाइन करने का क्या मतलब है यदि आप दोनों स्थानों पर समान गणना कर रहे हैं जहां' @ z' का उपयोग किया जाता है ?! –

संबंधित मुद्दे