2011-06-15 3 views
5

मैं नहीं जानता कि यह वास्तव में कैसे शब्द इस सवाल का, लेकिन यहाँ है। मैं उन मानों का पुन: उपयोग करना चाहता हूं जिन्हें मैंने अपनी क्वेरी में किसी अन्य मान की गणना करने के लिए गणना की थी। वैरिएबल सही शब्द है जो मुझे लगता है। यहाँ मेरी क्वेरी है:Mysql - पुन: उपयोग परिकलित मानों

SELECT 
    t1.label as label,SUM(t1.totalEvents) as Entry,SUM(t2.totalEvents) as Back, 
    ROUND(Entry/Back*100,2) as 'Rate' 
FROM 
    trackReports_daily t1 
.... rest of query ... 

अंदर दौर मैं मूल्य योग (t1.totalEvents) द्वारा दिया उपयोग करने के लिए करना चाहते हैं, लेकिन मैं जब मैं Entry का उपयोग इस त्रुटि Unknown column 'Entry' in 'field list'

और कैसे मैं प्राप्त कर सकते हैं मिल इस तरह हर recalculating बिना वहाँ में मूल्य:

ROUND(SUM(t2.totalEvents)/SUM(t1.totalEvents)*100,2) 
+0

संबंधित: http://stackoverflow.com/questions/1368084/can-i-re-use -एक अभिव्यक्ति में एक-mysql-क्वेरी के रूप में एक-चर के लिए एक और क्षेत्र –

+0

के संभावित डुप्लिकेट [मैं एक चयन करें क्वेरी में परिकलित क्षेत्र resuse कर सकते हैं?] (http://stackoverflow.com/ प्रश्न/6085443/कर सकते हैं-ए-resuse एक गणना क्षेत्र में एक-चयन-क्वेरी) –

उत्तर

5

आप एक सबक्वेरी इस्तेमाल कर सकते हैं:

SELECT label, Entry, Back, ROUND(Entry/Back*100,2) as 'Rate' 
FROM (
    SELECT SUM(t1.totalEvents) as Entry, SUM(t2.totalEvents) as Back, t1.label as label 
    FROM trackReports_daily t1 
    .... rest of query ... 
) as temp; 
+1

यह सबसे तेजी से क्वेरी है, तो आप श्रीमान – Ibu

1

एक विकल्प की तरह FROM खंड में एक सबक्वेरी उपयोग करने के लिए होगा:

SELECT 
    t1.label as label,SUM(t1.totalEvents) as Entry,t2.Back, 
    ROUND(t1.Entry/t2.Back*100,2) as 'Rate' 
FROM 
    (SELECT *, SUM(totalEvents) as Entry FROM trackReports_daily) t1 
    (SELECT *, SUM(totalEvents) as Back FROM someTable) t2 
.... rest of query ... 

यदि आप आगे के प्रश्नों में दर का पुन: उपयोग करना चाहते हैं तो यह जटिल हो जाएगा, और मुझे नहीं पता कि इसमें इष्टतम प्रदर्शन होगा, लेकिन मुझे लगता है कि यह आपके उदाहरण में जो किया गया है वह करेगा।

10

इस उदाहरण पर एक नजर डालें

select (select @t1:=sum(field1)),(select @t2:=sum(field2)),@t1/@t2 from table 
+0

यह धन्यवाद वास्तव में सबसे अच्छा जवाब है। MySQL में करना इतना आसान है, फिर भी अधिकांश लोग जो इस सुविधा को नहीं जानते हैं वे सबक्वायरीज़ का उपयोग करते हैं। –

+1

MySQL दस्तावेज़ के अनुसार "उपयोगकर्ता चर शामिल अभिव्यक्तियों के मूल्यांकन के लिए आदेश अपरिभाषित है" http://dev.mysql.com/doc/refman/5.6/en/user-variables.html क्या यह समाधान सुरक्षित है? – Andrea

+1

यह एक अच्छा अभ्यास नहीं है; परिणाम की गारंटी नहीं है। MySQL मैनुअल: "एक सामान्य नियम के रूप में, सेट बयान में अन्य की तुलना में, आप एक उपयोगकर्ता चर को कोई मान निर्दिष्ट नहीं किया जाना चाहिए ..."। "इस तरह के चयन के रूप में अन्य विवरण, के लिए, आप परिणाम आप उम्मीद हो सकती है, लेकिन यह गारंटी नहीं है"। – bbe