На моем сайте я пытаюсь найти места поблизости.
Я пытаюсь использовать для этого формулу Хаверсайна.
Я использую следующий запрос, чтобы получить все местоположения в радиусе 25 км.
SELECT id, ( 6371 * acos( cos( radians(51.8391) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(4.6265) ) + sin( radians(51.8391) ) * sin( radians( lat ) ) ) ) AS distance
FROM shops
HAVING distance < 25
ORDER BY name asc
Однако я думаю, что некоторые функции могут быть только MySQL, потому что я получаю следующую ошибку:
Предупреждение: PDOStatement :: execute () [pdostatement.execute]: SQLSTATE [42883]: неопределенная функция: 7 ОШИБКА: радианы функции (текст) не существует LINE 1: ... id, (6371 * acos (cos (радианы (51.8391)) * cos (радианы (l ... ^ СОВЕТ: ни одна функция не соответствует заданному типу имени и аргумента. Возможно, вам потребуется добавить явное приведение типов. в ...
Или, возможно, это связано с тем, что мне нужно изменить текст lat
в моем запросе. Но я не знаю, что это должно быть.
51.8391 и 4.6265 - это длина и широта моей «начальной» точки.
Любая помощь очень ценится, так как я понятия не имею, что изменить: -)
EDIT
Похоже, проблема в том, что я пытаюсь сделать: radians(lat)
.
lat - это столбец в моей таблице.
Когда я пытаюсь использовать rad()
, как предположил Хакре, ошибка меняется на: function rad(numeric) does not exist
РЕДАКТИРОВАТЬ 2
Теперь мы куда-то добираемся.
Тип данных столбцов, которые действительно заданы как текст (как предполагает mu, слишком короткий).
Я изменил его на двойную точность.
Однако теперь я получаю еще одну ошибку:
Предупреждение: PDOStatement :: execute () [pdostatement.execute]: SQLSTATE [42703]: неопределенный столбец: 7 ОШИБКА: столбец «расстояние» не существует LINE 1: ... adians (lat)))) AS расстояние ОТ магазинов, имеющих расстояние <... ^ в ... </p>
Но я думал, что сделал псевдоним для выбора. Есть идеи?
Кроме того, если вы, ребята, думаете, что это должно перейти в другой вопрос, просто дайте мне знать, и я закрою этот вопрос.