mysql根据距离过滤数据并计算该距离

3ks5zfa0  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(464)

我有一个用例,用户将他的位置(纬度和经度)传递到后端,我必须得到那个位置,并找到所有半径为英里的餐厅作为他的位置,同时我必须给出每个餐厅距离他的位置的距离。
我的餐桌。

res_name    |   lat         |   lng
--------------------------------------------------------------
McDonalds'  |   6.8705452   |   79.884038
KFC     |   6.8705452   |   79.884038
Burger king |   6.8686279   |   79.8873961
--------------------------------------------------------------

要查找与用户提供的坐标(以英里为半径)相匹配的记录,我可以使用此查询

SELECT
  id, (
    3959 * acos (
      cos ( radians(78.3232) )
      * cos( radians( lat ) )
      * cos( radians( lng ) - radians(65.3234) )
      + sin ( radians(78.3232) )
      * sin( radians( lat ) )
    )
  ) AS distance
FROM markers
HAVING distance < 30
ORDER BY distance
LIMIT 0 , 20;

这也是我从一个stackoverflow问题中得到的,它是有效的。现在我的问题是如何得到每个匹配结果的用户位置到餐厅位置之间的距离?
我希望你明白我的问题。
用户将通过其当前位置。基于这个位置,我需要过滤半径为30英里的餐厅。同时我还得说餐厅离他现在的位置还有多远。
我的预期产出是这样的。在30英里的范围内有两家餐厅。对于肯德基你有12英里的距离。麦当劳的距离是29英里。
如何修改该查询以达到我的要求?

dgtucam1

dgtucam11#

用于查找距离部分

SELECT test2.restaurants.res_name, 
   111.111 *
    DEGREES(ACOS(COS(RADIANS(6.9117))
         * COS(RADIANS(test2.restaurants.lat))
         * COS(RADIANS(79.8646 - test2.restaurants.lng))
         + SIN(RADIANS(6.9117))
         * SIN(RADIANS(test2.restaurants.lat)))) AS distance_in_km
  FROM test2.restaurants;

相关问题