MySQL MIN запрос не работает для рассчитанного расстояния - PullRequest
0 голосов
/ 06 июля 2019

У меня есть таблица мест в моей базе данных.Мне нужен запрос, чтобы узнать ближайшее местоположение, при условии каких-либо координат.Я написал следующий запрос, чтобы получить все строки вместе с их соответствующим расстоянием от заданной координаты (расстояние в метрах):

SELECT *, 111111 * DEGREES(ACOS(LEAST(COS(RADIANS(dest.latitude)) * COS(RADIANS(8.584710)) * COS(RADIANS(dest.longitude - 76.868735)) + SIN(RADIANS(dest.latitude)) * SIN(RADIANS(8.584710)), 1.0))) as  distance FROM offer dest;

Это дает следующий вывод:

+----+------------------------+----------+-----------+------------+---------------------+
| id | description            | latitude | longitude | name       | distance            |
+----+------------------------+----------+-----------+------------+---------------------+
|  2 | Location 1 Description | 8.574858 | 76.874748 | Location 1 |   1278.565430298969 |
| 12 | Location 2 Description | 8.584711 | 76.868738 | Location 2 | 0.35494725284463646 |
+----+------------------------+----------+-----------+------------+---------------------+

Itвсе работает нормально.Теперь, чтобы получить минимальное расстояние, я добавил HAVING MIN(distance) к этому запросу.Теперь запрос выглядит следующим образом:

SELECT *, 111111 * DEGREES(ACOS(LEAST(COS(RADIANS(dest.latitude)) * COS(RADIANS(8.584710)) * COS(RADIANS(dest.longitude - 76.868735)) + SIN(RADIANS(dest.latitude)) * SIN(RADIANS(8.584710)), 1.0))) as  distance FROM offer dest having MIN(distance);

Теперь этот запрос должен возвращать 1 строку, и это должно быть Расположение 2, так как он имеет минимальное местоположение, но вместо этого возвращается местоположение 1, как виднониже:

+----+------------------------+----------+-----------+------------+---------------------+
| id | description            | latitude | longitude | name       | distance            |
+----+------------------------+----------+-----------+------------+---------------------+
|  2 | Location 1 Description | 8.574858 | 76.874748 | Location 1 |   1278.565430298969 |
+----+------------------------+----------+-----------+------------+---------------------+

Почему это так?Что-то не так с моим запросом?Если да, что это и как я могу получить местоположение с минимальным расстоянием.

1 Ответ

2 голосов
/ 06 июля 2019

A HAVING -класс используется для фильтрации условий для группы.Группа определяется с помощью агрегатной функции в SELECT -части и с GROUP BY.Так как у вас нет ни одного из них, вы не должны использовать HAVING.

Если вы хотите показать минимальное расстояние от порядка расположения строк по расстоянию и ограничить набор результатов только одной строкой.

SELECT *, 
  111111 * DEGREES(ACOS(LEAST(COS(RADIANS(dest.latitude)) *
  COS(RADIANS(8.584710)) * COS(RADIANS(dest.longitude - 76.868735)) + 
  SIN(RADIANS(dest.latitude)) * SIN(RADIANS(8.584710)), 1.0))) as  distance
FROM offer dest 
ORDER BY distance
LIMIT 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...