2012-07-27 8 views
5

मैं बहुत की तरह एक प्रश्न है:इनर का उपयोग कर MySQL एक गणना स्तंभ के उपनाम पर मिलती है

SELECT User.id, 10*10 as distance 
FROM USERS 
INNER JOIN 
(
    SELECT Location.user_id, 
    min(10 * 10) as mindistance 
    FROM Location 
    GROUP BY Location.user_id 
) L ON Users.id = Location.user_id AND distance = L.mindistance 

अगर मैं यह छोड़ना है, मैं मिलती रहती है:

Unknown column 'distance' in 'on clause' 

लेकिन अगर मैं डाल सिर्फ दूरी के बजाय User.distance, मैं मिलता है:

MySQL syntax error near.... 

मैं परिकलित मैदान पर उर्फ ​​इस तरह से उपयोग नहीं कर सकते? 10 * 10 सिर्फ एक साधारण प्लेसहोल्डर है क्योंकि गणना अधिक जटिल है।

+0

संभावित डुप्लिकेट [MySQL क्वेरी के WHERE खंड में कॉलम उपनाम का उपयोग करना एक त्रुटि उत्पन्न करता है] (http://stackoverflow.com/questions/942571/using-column-alias-in-where-clause-of-mysql-query-produces -न-त्रुटि) – Joni

उत्तर

0
SELECT User.id, 10*10 as distance 
FROM USERS 
INNER JOIN 
( 
    SELECT Location.user_id, 
    min(10 * 10) as mindistance 
    FROM Location 
    GROUP BY Location.user_id 
) L ON User.id = Location.user_id AND L.mindistance =10*10 
0

आप एक प्रश्न में ली गई मानों का उपयोग नहीं कर सकते हैं जहां खंड - जहां रिकॉर्ड प्रतिबंधित करने के लिए प्रयोग किया जाता है और जो अनुक्रमित उपयोग करने के लिए - व्युत्पन्न मूल्यों अनुकूलक द्वारा उपयोग नहीं किया जा सकता है ताकि आप फ़िल्टर करना अंतिम परिणाम की जरूरत है ।

काफी यकीन नहीं तुम क्या कर रहे हैं, लेकिन कुछ ऐसे प्रयास करें:

SELECT User.id, 10*10 as distance 
FROM USERS 
INNER JOIN 
( 
    SELECT Location.user_id, 
    min(10 * 10) as mindistance 
    FROM Location 
    GROUP BY Location.user_id 
) L ON User.id = Location.user 
HAVING USERS.distance = L.mindistance 
5

क्वेरी में गणना तीन बार बनाने के लिए होने से बचने के लिए, आप एक FROM सबसिलेक्ट में बाहरी गणना लपेट कर सकते हैं, जो होगा आप aliased फ़ील्ड नाम पर पहुँच प्रदान (जहां यह आपकी मूल क्वेरी में सुलभ नहीं था):

SELECT a.* 
FROM 
(
    SELECT id, 10*10 AS distance 
    FROM USERS 
) a 
INNER JOIN 
(
    SELECT user_id, 
    MIN(10 * 10) AS mindistance 
    FROM Location 
    GROUP BY user_id 
) L ON a.id = L.user_id AND a.distance = L.mindistance 

यहाँ, गणना केवल तीन में से दो बार के बजाय किया जाता है।

10

आप ON खंड में कॉलम उपनाम का उपयोग करने का प्रयास कर रहे हैं। MySQL documentation इस इस स्थिति के बारे में क्या कहना है:

conditional_exprON के साथ इस्तेमाल किया रूप है कि एक कहां खंड में इस्तेमाल किया जा सकता के किसी भी सशर्त अभिव्यक्ति है।

And also:

मानक SQL एक कहां खंड में स्तंभ नामों पर संदर्भ की अनुमति नहीं देता। यह प्रतिबंध लगाया गया है क्योंकि जब WHERE क्लॉज का मूल्यांकन किया जाता है, तो स्तंभ मान अभी तक निर्धारित नहीं किया जा सकता है। उदाहरण के लिए, निम्न क्वेरी अवैध है:

जिसके अनुसार, आप उपयोग चर कर सकते हैं ON खंड में अभिव्यक्ति की गणना और फिर इस तरह स्तंभ सूची में मान का उपयोग, करने के लिए:

SELECT User.id, @dist as distance 
FROM USERS 
INNER JOIN 
(
    SELECT Location.user_id, 
    min(10 * 10) as mindistance 
    FROM Location 
    GROUP BY Location.user_id 
) L ON Users.id = Location.user_id AND (@dist := 10*10) = L.mindistance 
+0

लेखक के एसक्यूएल में कोई WHERE क्लॉज नहीं है। –

+1

फिक्स्ड @ जॉन फैक्टोरियल – Joni

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