Я хочу получить 5 строк из таблицы, значение которой «lat» ближе всего к 30. Я разрабатываю приложение Google MAP, где мне нужно 5 ближайших мест из базы данных. Моя таблица выглядит так,Получите 5 строк из таблицы
ответ
MySQL обеспечивает функцию Math, которая превращает отрицательные числа в абсолютных значениях. С помощью этого, вы можете получить пять ближайших местах, является ли чуть ниже или выше, чем 30 их широта:
ORDER BY ABS(lat - 30) ASC LIMIT 5
ASC
не является обязательным, как это порядок сортировки по умолчанию во всех СУБД (спасибо Гордон).
. , 'ASC' является значением по умолчанию во всех базах данных. –
Как примечание, если вы хотите сделать это эффективно и у вас есть индекс по lat
, то следующий более сложный запрос должен работать лучше:
select t.*
from ((select t.*
from table t
where lat <= 30
order by lat desc
limit 5
) union all
(select t.*
from table t
where lat > 30
order by lat asc
limit 5
)
) t
order by abs(lat - 30)
limit 5;
Два подзапросы могут использовать индекс lat
для избегайте сортировки. Внешний запрос затем сортирует только 10 строк.
На карте "ближайшее местоположение" следует опираться на расстояние двух точек, иначе lat 30.00, long 75.00 будет "ближайшим" местом.
Весьма точный расчет расстояния между двумя точками (широта/долгота) основана на Haversine formula:
DEGREES(ACOS(COS(RADIANS(ref_latitude)) *
COS(RADIANS(latitude)) *
COS(RADIANS(ref_longitude) - RADIANS(longitude)) +
SIN(RADIANS(ref_latitude)) *
SIN(RADIANS(latitude)))) AS distance
latitude = `lat`
longitude = `long`
ref_latitude & ref_longitude = the point you want to find the nearest locations from
`DOUBLE` should be used for calculation
Это приводит в градусах, умножить на 111.195 для приближенного расстояния в километрах или путем 69.093 для миль.
Как вы хотите вблизи места вы могли бы пойти на более простой расчет с использованием Pythagorean theorem
sqrt(power(lat-ref_latitude, 2) +
power((lng-ref_longitude)*cos(radians(ref_latitude)), 2))
снова умножить на 111,195 километров или 69.093 для миль.
Теперь просто ORDER BY
это расстояние.
И вместо сравнения со всеми строками в базе данных вы должны ограничить количество строк для сравнения, например.
WHERE latitude BETWEEN ref_latitude - 0.2 and ref_latitude + 0.2
AND longitude BETWEEN ref_longitude - 0.2 and ref_longitude + 0.2
Btw, некоторые DBMSes поддержки геопространственных расширения как distance
функций или геопространственных индексов.
Теперь я хочу получить 5 ближайших мест, у меня есть место lat, долгое время в базе данных, и я хочу сравнить его расстояние от моего текущего местоположения. как я должен выполнить эту задачу, должен ли я получить весь lat, длинный от базы данных, и после этого я бы вычислил расстояние, а затем покажу 5 ближайшего местоположения –
@PirFahimShah: 'ORDER BY distance LIMIT 5' или любой другой синтаксис поддерживается вам СУБД. – dnoeth
- 1. PostgreSQL Выберите из таблицы 5 миллионов строк
- 2. Выберите ровно 5 строк из таблицы
- 3. Получите данные таблицы строк в ContextMenu
- 4. Получите количество строк из ResultSet
- 5. Получите 5 лучших результатов
- 6. Получите кратность из 5 из списка
- 7. Получите 10 строк из запроса
- 8. Получите ответ из таблицы, используя данные из другой таблицы
- 9. Получите десятичное число из таблицы
- 10. Получите много строк из списка идентификаторов
- 11. Получите одно число строк из SQL-запроса
- 12. Выберите верхние 5 строк из таблицы, кроме последней строки
- 13. Выбор 5 строк из таблицы, но одна строка конкретно указана
- 14. Через 5 лет несколько строк исчезли из таблицы mySQL innoDB
- 15. Создание 5 отчетов из пяти верхних строк отфильтрованной таблицы
- 16. Как включить первые 5 строк таблицы из MYSQL в PHP
- 17. Получите n строк из файла, равных разнесенных
- 18. Получите заданное количество строк из массива
- 19. Получите 5 лучших значений из списка словарей?
- 20. Вставьте несколько строк из другой таблицы и получите идентификаторы вставленных строк в SQL Server 2000
- 21. Получите 5 лучших результатов (всего: 5) из списка
- 22. Извлечение строк из таблицы
- 23. Получите дубликатов пользователей из таблицы заказов
- 24. Как вы grep файл и получите следующие 5 строк
- 25. Получите содержимое первых 5 строк и эхо их
- 26. Объединение строк из таблицы
- 27. соответствующие строк из таблицы
- 28. Подсчет строк из таблицы
- 29. Получите конкретное значение из справочной таблицы?
- 30. Получите все нулевые строки строк?
'ORDER BY ABS (lat - 30) ASC LIMIT 5' – Paul
@Paul, вы замечательный, комментируете как ответ, я буду принимать его –
Какие dbms? LIMIT является специфичным для продукта ... – jarlh