2016-07-30 43 views
-1

嘿,有没有一种方法可以按距离顺序得到最近10个目的地的列表,我的MySQL数据库有用户和地点的经度和纬度。我不想指定用户和地点之间的距离,也就是没有最大或最小距离,只是我需要的最接近的10个地方。用户和地点都共享同一个表。距离他们的距离顺序最近的10个目的地

+0

yes - 这是可能的 – RamRaider

+0

有,但它很慢....你可以通过指定一个边界框,并使用不断增加的边界框执行一系列查询来提高效率,直到你有10个条目 –

+0

我写了10例如,实际上我至少需要100,所以它不是一个好主意我猜:( –

回答

2

可以使用半正矢公式:

SELECT t.*, (6371 * ACOS(COS(RADIANS(lat_user)) * COS(RADIANS(lat)) * 
      COS(RADIANS(lng) - RADIANS(lng_user)) + SIN(RADIANS(lat_user)) * 
      SIN(RADIANS(lat)))) AS distance -- distance in kilometers 
FROM yourTable 
ORDER BY distance ASC 
LIMIT 10 

在上述查询我假定lat_userlng_user是用户的纬度和经度。并且latlng是给定地点(记录)的经度和纬度。

阅读this SO question了解更多信息。

+0

除了这将通过每一个单进入数据库表....这将使它非常,非常慢... Haversine是一个昂贵的,缓慢的公式计算 –

+0

我没有通过拉特和长的地方,我必须从数据库中获取位置 –

+0

@MarkBaker是的,对于拥有频繁用户或许多用户的大型数据库来说,这不会很好地扩展。但是对于数百或数千条记录来说,它应该是可行的。长期来看,某种地理分区是更好的方式。 –