MySQL фильтрует данные на основе расстояния и вычисляет это расстояние

У меня есть вариант использования, когда пользователь передает свое местоположение (широту и долготу) в серверную часть, я должен получить это местоположение и найти все рестораны с зоной радиуса в Милях для его местоположения, в то же время я должен дать расстояние до каждого ресторана от его местоположения.

Мой столик в ресторане.

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;

это также я получил из вопроса о переполнении стека, и он работает. Теперь моя проблема в том, как мне получить расстояние между местоположением пользователя и рестораном для каждого совпадающего результата?

Надеюсь, мои поиски вам понятны.

Пользователь передаст свое текущее местоположение. На основе этого местоположения мне нужно отфильтровать рестораны в радиусе 30 миль. В то же время я должен указать расстояние до ресторана от его текущего местоположения.

Мои ожидаемые результаты будут такими. У вас есть два ресторана в районе 30 миль. для KFC у вас есть расстояние 12 миль. для McDonalds - 29 миль.

Как мне изменить этот запрос, чтобы удовлетворить мои требования?


person Pathum Kalhan    schedule 26.11.2018    source источник
comment
Откуда идёт?   -  person Strawberry    schedule 26.11.2018


Ответы (1)


Для поиска дистанционной части

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;
person Pathum Kalhan    schedule 26.11.2018