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;
4

1 回答 1

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;
于 2013-08-02T09:52:08.827 回答