2015-09-02 2 views
0

Я использую следующий код для извлечения моей базы данных для событий в пределах определенных расстояний введенной широты и долготы:вычисления расстояния MySQL

SELECT *, 
    (3959 * acos(
     cos(radians($latitude)) 
     * cos(radians(event_latitude)) 
     * cos(radians(event_longitude) - radians($longitude)) 
     + sin(radians($latitude)) 
     * sin(radians(event_latitude)) 
    )) AS distance 
FROM events 
HAVING distance < $distance 

Это прекрасно работает. Однако некоторые из моих событий не имеют широты или долготы вообще (у них нет физических мест). Таким образом, для них event_latitude и event_longitude оба равны 0.

Есть ли способ получить по HAVING distance или event_latitude = 0? Чтобы я мог получить результат, который имеет события на определенном расстоянии И события, которые вообще не имеют широты или долготы?

Если я поставил проверку оценки на 0 в оговорке WHERE, она все равно потерпит ошибку HAVING. И я не могу поместить оценку в предложение HAVING, потому что получаю неизвестную ошибку столбца.

У кого-нибудь есть идеи?

+0

Добавить 'или sum (event_latitude = 0)> 0' до конца –

+0

Являются ли поля event_lat/long NULL, когда события не имеют физических местоположений? Не могли бы вы разместить свою структуру БД? Каковы значения по умолчанию для этих длинных полей lat? – khuderm

+0

Они не являются нулевыми, они равны 0. –

ответ

0

Вы хотите посмотреть условные операторы select here Вы можете написать что-то вроде, если поле 0, а затем извлечь его как есть, а если нет, то выполните расчет.

+0

Это не даст результатов, которые я хочу. Это даст мне только события, которые имеют широты и долготы. Я хочу событий на расстоянии ИЛИ событий, где широты и долготы равны нулю. –

+0

Вы можете рассмотреть этот вопрос как простой пример http://stackoverflow.com/questions/4809155/mysql-if-condition-in-a-calculated-field – khuderm

+0

Я не понимаю, как этот простой пример работает в этом случае. –

0

Возможно, мне что-то не хватает; это не работает?

SELECT *, 
    (3959 * acos(
     cos(radians($latitude)) 
     * cos(radians(event_latitude)) 
     * cos(radians(event_longitude) - radians($longitude)) 
     + sin(radians($latitude)) 
     * sin(radians(event_latitude)) 
    )) AS distance 
FROM events 
HAVING distance < :distance OR (event_latitude = 0 AND event_longitude = 0) 

(обратите внимание, что я поменял ваше расстояние $ a: расстояние, поскольку оно должно быть параметром, вероятно).

+0

Нет, это не так. Ниже приведена ошибка Unknown Column для event_latitude и event_longitude. –

+0

Это странно, потому что вы используете эти столбцы в своих вычислениях для расстояния и возвращаете их с помощью 'SELECT *' - можете ли вы подтвердить, что вы не удалили '*' из вашего запроса 'SELECT', когда вы проверяете это? –

+0

Как в стороне, есть ли причина, по которой вы используете предложение 'HAVING' вместо предложения WHERE? –

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