MySQL - Поиск отрицательных значений долготы с помощью BETWEEN

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

У меня есть сайт, на котором я использую Карты Google, и в качестве повышения производительности я ограничиваю маркеры, нарисованные на карте, теми, которые находятся в границах карты.

Я хотел бы разработать запрос, который будет работать с положительным или отрицательнымlatitude а такжеlongitude ценности.

Для базы данных:

latitude FLOAT( 10, 6 )
longitude FLOAT( 10, 6 )

Запрос:

SELECT *
FROM `table` 
WHERE `latitude` BETWEEN 47.926930 AND 47.929806 
AND `longitude` BETWEEN -97.077303 AND -97.083997

Если я уронюBETWEEN пункт дляlongitude Я получаю результаты, хотя и неверно безlongitude ограничение.

Я попробовал это:

AND -`longitude` BETWEEN ABS( -97.077303 ) AND ABS( -97.083997 )

Который работает, но только для негативаlongitude ценности.

Нужно ли проверятьlongitude если его отрицательный?

 scwagner02 апр. 2012 г., 20:42
При использовании BETWEEN сначала вы должны иметь более низкое значение, а второе - более высокое. -98.083997 ниже, чем -97.077303, поэтому поменяйте местами порядок в предложении BETWEEN.
 hungerstar02 апр. 2012 г., 21:12
Ах да, что-то простое и очевидное, как обычно. Спасибо! Иногда вам просто нужен еще один набор глаз. Будет ли это приемлемым решением?SELECT * FROM table WHERE latitude BETWEEN LEAST( 47.926930, 47.929806 ) AND GREATEST( 47.926930, 47.929806 ) AND longitude BETWEEN LEAST( -97.077303, -97.083997 ) AND GREATEST( -97.077303, -97.083997 )

Ответы на вопрос(3)

)

SELECT *
FROM `table` 
WHERE `latitude` BETWEEN 47.926930 AND 47.929806 
  AND `longitude` BETWEEN -97.083997 AND -97.077303 
 hungerstar02 апр. 2012 г., 21:14
Я вижу, что ваше решение является решением первого комментария выше, но не так ясно. Если вы немного уточнить, так что более очевидно, что вы меняли значения долготы, я отмечу как принятые. Что вы думаете об этом запросе, чтобы решить проблему?SELECT * FROM table WHERE latitude BETWEEN LEAST( 47.926930, 47.929806 ) AND GREATEST( 47.926930, 47.929806 ) AND longitude BETWEEN LEAST( -97.077303, -97.083997 ) AND GREATEST( -97.077303, -97.083997 )

between ожидает, что формат будетsomefield BETWEEN lowervalue AND highervalue, Ваши отрицательные долготы имеют переключенные более высокие / более низкие значения. Так должно быть

отрицательный 97.08 на самом деле ниже, чем отрицательный 97.07

 hungerstar02 апр. 2012 г., 21:15
Да спасибо. Будет ли это работать?SELECT * FROM table WHERE latitude BETWEEN LEAST( 47.926930, 47.929806 ) AND GREATEST( 47.926930, 47.929806 ) AND longitude BETWEEN LEAST( -97.077303, -97.083997 ) AND GREATEST( -97.077303, -97.083997 )
 Marc B03 апр. 2012 г., 05:16
да, должно хорошо сработать.least(-1, -2) возвращается-2и наоборот (-1) для наибольшего ().
Решение Вопроса

Вы также можете использоватьgreatest() а такжеleast() функции, так что вам не нужно беспокоиться о параметрах. Например:

SELECT * FROM table
WHERE latitude BETWEEN least(@lat1, @lat2) AND greatest(@lat1, @lat2)
AND  longitude BETWEEN least(@lon1, @lon2) AND greatest(@lon1, @lon2)
 hungerstar02 апр. 2012 г., 21:16
Я только что придумал это решение! как опубликовано выше в паре ответов и комментариев. Дайте мне знать, что вы думаете! Спасибо!
 hungerstar02 апр. 2012 г., 21:32
Принято, как это работает для правильного заказаBETWEEN требует более низкого значения перед более высоким значением и обрабатывает положительные / отрицательные значения, которыми обладают широта и долгота.

Ваш ответ на вопрос