Я пытаюсь получить всех пользователей в радиусе 5 км. вот моя структура таблицы
id| location ------------- 1| 26.851791,75.781810 2| 26.860729,75.7633127 3| 34.057811,-84.239125
Я пишу запрос для разделения местоположения в соответствии с lat
и long
SELECT SUBSTRING_INDEX( location, ',', 1 ) AS lat, SUBSTRING_INDEX( location, ',', -1 ) AS lng FROM `users_test` LIMIT 0 , 30
Что хорошо работает, и я получил результаты в следующем
то я пишу запрос, чтобы получить всех пользователей, которые находятся в радиусе 5KM согласно следующему блогу.
https://www.marketingtechblog.com/calculate-distance/
SELECT *,SUBSTRING_INDEX( location, ',', 1 ) AS lat, SUBSTRING_INDEX( location, ',', -1 ) AS lng,(((acos(sin(("26.851791"*pi()/180)) * sin((`lat`*pi()/180))+cos(("26.851791"*pi()/180)) * cos((`lat`*pi()/180)) * cos((("75.781810"- `lng`)*pi()/180))))*180/pi())*60*1.1515*1.609344) as distance FROM `users_test` WHERE distance >= "5"
но я получаю следующую ошибку.
# 1054 – Неизвестный столбец 'lat' в 'списке полей'
может кто-нибудь сказать мне, где я ошибаюсь.
Вы не можете ссылаться на псевдоним столбца в том же предложении SELECT
. Вам нужно переместить его в подзапрос. И вы не можете ссылаться на псевдоним в WHERE
того же SELECT
, вам нужно использовать HAVING
.
SELECT *, (((acos(sin(("26.851791"*pi()/180)) * sin((`lat`*pi()/180))+cos(("26.851791"*pi()/180)) * cos((`lat`*pi()/180)) * cos((("75.781810"- `lng`)*pi()/180))))*180/pi())*60*1.1515*1.609344) as distance FROM (SELECT *, SUBSTRING_INDEX( location, ',', 1 ) AS lat, SUBSTRING_INDEX( location, ',', -1 ) AS lng FROM users_test) x HAVING distance > 5
Я настоятельно рекомендую вам исправить ваш дизайн таблицы, чтобы поместить широту и долготу в свои собственные столбцы, вместо того, чтобы каждый раз делиться на запятую.