我正在寻找一个快速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;
答案 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;