समस्या यह है कि आप किसी अलियास्ड कॉलम का संदर्भ नहीं दे सकते (distance
इस मामले में) select
. में या where
खंड। उदाहरण के लिए, आप ऐसा नहीं कर सकते:
select a, b, a + b as NewCol, NewCol + 1 as AnotherCol from table
where NewCol = 2
यह दोनों में विफल होगा:select
NewCol + 1
process को संसाधित करने का प्रयास करते समय कथन और where
. में भी NewCol = 2
process को संसाधित करने का प्रयास करते समय कथन ।
इसे हल करने के दो तरीके हैं:
1) संदर्भ को परिकलित मान से ही बदलें। उदाहरण:
select a, b, a + b as NewCol, a + b + 1 as AnotherCol from table
where a + b = 2
2) एक बाहरी select
का उपयोग करें कथन:
select a, b, NewCol, NewCol + 1 as AnotherCol from (
select a, b, a + b as NewCol from table
) as S
where NewCol = 2
अब, आपके विशाल और बहुत मानव-अनुकूल गणना वाले कॉलम को देखते हुए :) मुझे लगता है कि आपको पठनीयता में सुधार के लिए अंतिम विकल्प के लिए जाना चाहिए:
SET @orig_lat=55.4058;
SET @orig_lon=13.7907;
SET @dist=10;
SELECT * FROM (
SELECT
*,
3956 * 2 * ASIN(SQRT(POWER(SIN((@orig_lat -abs(latitude)) * pi()/180 / 2), 2)
+ COS(@orig_lat * pi()/180 ) * COS(abs(latitude) * pi()/180)
* POWER(SIN((@orig_lon - longitude) * pi()/180 / 2), 2) )) as distance
FROM geo_kulplex.sweden_bobo
) AS S
WHERE distance < @dist
ORDER BY distance limit 10;
संपादित करें: जैसा कि @Kaii ने नीचे बताया है, इसके परिणामस्वरूप एक पूर्ण टेबल स्कैन होगा। आपके द्वारा संसाधित किए जा रहे डेटा की मात्रा के आधार पर आप इससे बचना चाहेंगे और पहले विकल्प के लिए जा सकते हैं, जो तेजी से प्रदर्शन करना चाहिए।