2013-08-02 69 views
3

我正在尋找一個快速MySQL查詢,從一個簡單的表格返回最近的位置查找子公司經度和緯度(地理位置)

表:locations

id | city | latitude | longitude 
----------------------------------------------- 
1 | Berlin | 52.524268 | 13.406290 
----------------------------------------------- 
2 | London | 51.508129 | -0.1280050  
----------------------------------------------- 
3 | Hamburg | 53.551084 | 9.9936817 
----------------------------------------------- 

客戶的座標( + ):

$intLat = '52.370215700000000000'; // lat Amsterdam 
$intLon = '4.895167899999933000'; // lon Amsterdam 

大多數提供的示例@SO基於距離計算

即使座標從Birmingham,它返回id=1(柏林)。 查詢應該返回倫敦,因爲它比柏林更近。不應該?

SELECT *, (3959 * acos(cos(radians($intLat)) 
        * cos(radians(latitude)) 
        * cos(radians(longitude) 
        - radians($intLon)) + sin(radians($intLat)) 
        * sin(radians(latitude)))) AS distance 
FROM locations 
HAVING distance < 10 
    AND id IN(1,2,3) 
LIMIT 1; 
+2

你將需要按計算出的距離ASC,使限採最低距離結果 –

+0

@MarkBaker OMG我洙笨...謝謝! – mate64

+0

愚蠢是我們學習的方式:我們對它很尷尬,我們再也不會犯同樣的錯誤:) –

回答

2

的問題是,你是選擇具有的10

半徑的所有位置。然後從該結果集選擇1個結果在隨機的LIMIT 1

您需要按距離排序,以便最近的位置位於最上方。
像這樣:

SELECT *, (3959 * acos(cos(radians($intLat)) 
      * cos(radians(latitude)) 
      * cos(radians(longitude) 
      - radians($intLon)) + sin(radians($intLat)) 
      * sin(radians(latitude)))) AS distance 

FROM locations 
HAVING distance < 10 
    AND id IN(1,2,3) 
ORDER BY distance ASC <<-- add this line 
LIMIT 1;