Смешение запросов MySQL HAVING и ORDER BY: ошибка при сортировке объектов с определенным местоположением, объекты получаются на расстоянии с другим местоположением - PullRequest
0 голосов
/ 22 января 2019

Я должен запросить некоторые объекты, которые находятся недалеко от города.Они должны быть отсортированы в соответствии с местоположением пользователя.

Поэтому я решил написать SQL-запрос, в котором дважды используется формула Пифагора.

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

Знаете ли вы, правильно ли я использую SQL, или это неправильная формула?

Данные

В следующем запросе ...

  • distance хранит расстояние между объектами и городом.

  • distance_2 хранит расстояние между объектами и местоположением пользователя.

  • lat и lon - координаты объектов.Запрос действительно выполняется в таблице объектов.

Местоположение пользователя

  • 47.643310
  • -2.805655

Местоположение города

  • 48.51666700

  • -2.78333300

Местоположение найденных объектов

Объект, ближайший к пользователю

  • 47,6593484

  • -2,7546085

Объект наименьшего к пользователю

  • 48,4962385

  • -2,7642788

Запрос

SELECT *, 

SQRT((48.51666700 - lat) * (48.51666700 - lat) + ((-2.78333300 - lon) * COS(RADIANS(lat))) * ((-2.78333300 - lon) * COS(RADIANS(lat)))) * 111.325 AS distance,

SQRT((47.64331000 - lat) * (47.64331000 - lat) + ((-2.80565500 - lon) * COS(RADIANS(lat))) * ((-2.80565500 - lon) * COS(RADIANS(lat)))) * 111.325 AS distance_2

FROM restaurants WHERE 1=1 AND visible = 1 HAVING distance < 200 ORDER BY distance_2 ASC

Порядок отображения

Ближайший объект отображается перед ближайшим, что ненормально (см. Следующую часть).

1 Ответ

0 голосов
/ 22 января 2019

Для большей точности (расстояния 20 миль / 32 километра) я бы посоветовал взглянуть на расчет расстояния по Большому кругу. Мы живем на земном шаре! Есть хороший пример по ссылке ниже от переполнения стека. Это формула Haversine, на которую ссылается JarsofJam. Автор начал с PHP, но спросил, как преобразовать его в чистый MySQL. Я полагаю, что вы можете без особых проблем адаптировать принятый ответ к вашим потребностям.

Расчет расстояния Большого круга MySql

Обратите внимание на правильное преобразование радиуса Земли в зависимости от того, работаете ли вы в километрах или милях.

...