Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

देशांतर और अक्षांश से दूरी के भीतर POI खोजने के लिए WHERE क्लॉज का उपयोग करना

समस्या यह है कि आप किसी अलियास्ड कॉलम का संदर्भ नहीं दे सकते (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 ने नीचे बताया है, इसके परिणामस्वरूप एक पूर्ण टेबल स्कैन होगा। आपके द्वारा संसाधित किए जा रहे डेटा की मात्रा के आधार पर आप इससे बचना चाहेंगे और पहले विकल्प के लिए जा सकते हैं, जो तेजी से प्रदर्शन करना चाहिए।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. एसक्यूएल दिनांक प्रारूप कन्वर्ट? [दिनांक मिमी.वर्ष से वर्ष-माह-दिन तक]

  2. एकल क्वेरी में एकाधिक चयन कथन

  3. ऑप्टिमाइज़िंग ऑर्डर BY

  4. MySQL में अद्वितीय बाधा कैसे लागू करें?

  5. पीडीओ मैसकल के साथ REGEXP