2015-05-18 4 views
-1

Я хочу получить 5 строк из таблицы, значение которой «lat» ближе всего к 30. Я разрабатываю приложение Google MAP, где мне нужно 5 ближайших мест из базы данных. Моя таблица выглядит так,Получите 5 строк из таблицы

enter image description here

+6

'ORDER BY ABS (lat - 30) ASC LIMIT 5' – Paul

+0

@Paul, вы замечательный, комментируете как ответ, я буду принимать его –

+1

Какие dbms? LIMIT является специфичным для продукта ... – jarlh

ответ

5

MySQL обеспечивает функцию Math, которая превращает отрицательные числа в абсолютных значениях. С помощью этого, вы можете получить пять ближайших местах, является ли чуть ниже или выше, чем 30 их широта:

ORDER BY ABS(lat - 30) ASC LIMIT 5 

ASC не является обязательным, как это порядок сортировки по умолчанию во всех СУБД (спасибо Гордон).

+0

. , 'ASC' является значением по умолчанию во всех базах данных. –

0

Как примечание, если вы хотите сделать это эффективно и у вас есть индекс по 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 строк.

1

На карте "ближайшее местоположение" следует опираться на расстояние двух точек, иначе 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 функций или геопространственных индексов.

+0

Теперь я хочу получить 5 ближайших мест, у меня есть место lat, долгое время в базе данных, и я хочу сравнить его расстояние от моего текущего местоположения. как я должен выполнить эту задачу, должен ли я получить весь lat, длинный от базы данных, и после этого я бы вычислил расстояние, а затем покажу 5 ближайшего местоположения –

+0

@PirFahimShah: 'ORDER BY distance LIMIT 5' или любой другой синтаксис поддерживается вам СУБД. – dnoeth

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