2016-06-29 3 views
2
SELECT 
    id, 
    (3959 * acos(cos(radians(51.509980)) * cos(radians(lat)) * cos(radians(lng) - radians(-0.133700)) + sin(radians(51.509980)) * sin(radians(lat)))) AS distance 
FROM tbl_event 
HAVING distance < 5 
ORDER BY distance 

Здесь -0.133700 создает проблему, другие минус-значения, такие как -122 и т. Д. Работают нормально.Формула Haversine возвращает null в запросе

Пожалуйста, помогите, если кто-то знает об этой проблеме.

+0

в приведенном выше запросе II не показывает какой-либо проблемы с -0.133700 выбора (3959 * ACOS (COS (радиан (51.509980)) * Cos (радиан (0.0)) * Cos (радиан (0.0) - radians (-0.133700)) + sin (радианы (51.509980)) * sin (радиан (0.0)))) AS distance –

+0

простой я заменяю ваш lat long 0.0 и проверяем его работу, возможно, проблема с вашими координатами lat, lng на БД вы можете поделиться этими сведениями –

+0

Спасибо Махеш Мадушанке за ваш комментарий. Я знаю, что в формуле нет никаких проблем. В основном я хочу 0 событий дистанции из моей базы данных, и у меня есть 2 записи с одинаковыми длинными значениями lat, которые равны 51.50998 (lat) и -0.1337 (long). Мое текущее местоположение lat long также одинаково, и оно должно возвращать 0 в качестве значения расстояния, но оно возвращает null. – Bhumika

ответ

1

Он возвращает значение null, потому что функция acos получает аргумент больше 1 или ниже -1. Попробуйте это:

Select id, 3959 * acos(if(d>1, 1, if(d<-1, -1, d))) as distance 
From (SELECT id, 
cos(radians(51.509980)) * cos(radians(lat)) * cos(radians(lng) - radians(-0.133700)) + sin(radians(51.509980)) * sin(radians(lat)) AS d 
FROM tbl_event) t1 
HAVING distance < 5 
ORDER BY distance 
+0

oohh great Msf vtp спасибо, что он возвращает 0. Большое спасибо – Bhumika

+0

@Bhumika Мое удовольствие. ☺ –

Смежные вопросы