MySQL запрос, чтобы получить записи, наиболее близкие к кому-либо на основе долготы и широты без диапазона - PullRequest
0 голосов
/ 21 февраля 2012

У меня есть таблица пользователей, которую я хочу, чтобы другие пользователи могли искать друг друга по имени. Как правило, это легко до определенной степени. Однако я хочу, чтобы пользователи с похожими именами отображались в порядке близости друг от друга, поэтому давайте скажем, что я ищу "Майк", но не знаю его фамилию. Я хочу, чтобы мои результаты отображались " Майк "находится в моей базе данных, начиная с ближайшего. У меня есть долгота / широта для всех моих пользователей, так что это не проблема, проблема в том, как мой запрос строится в настоящее время, и я должен предоставить определенный диапазон. Поэтому я пытаюсь выяснить, есть ли другой способ, которым я могу построить запрос, чтобы не указывать диапазон, поэтому он просто пойдет от ближайшего к дальнему.

Текущий запрос выглядит как

SELECT *,(((acos(sin(($lat*pi()/180)) * sin((`latitude`*pi()/180))+cos(($lat*pi()/180)) * cos((`latitude`*pi()/180)) * cos((($lon - `longitude`)*pi()/180))))*180/pi())*60*1.1515) AS `distance` FROM `memb_geo_locations` HAVING `distance` < $range ORDER BY `distance` ASC"

С другой стороны, мне, вероятно, придется сформировать ВНУТРЕННЕЕ СОЕДИНЕНИЕ, так как имена, которые я буду искать, находятся в другой таблице. где member_id является ссылкой между двумя таблицами. другой стол будет иметь member_id, имя, фамилия географическая таблица имеет member_id, долгота, широта, первичная

Есть идеи?

Ответы [ 2 ]

1 голос
/ 21 февраля 2012
SELECT 
  *,
  (((acos(sin(($lat*pi()/180)) * sin((`latitude`*pi()/180))+cos(($lat*pi()/180)) 
    * cos((`latitude`*pi()/180)) 
    * cos((($lon - `longitude`)*pi()/180))))*180/pi())*60*1.1515) AS `distance` 
FROM `memb_geo_locations` 
ORDER BY `distance` DESC

Для первой части вашего вопроса просто удалите HAVING и ORDER BY DESCending.

Добавление объединения должно быть достаточно простым:

0 голосов
/ 21 февраля 2012

Чтобы исключить диапазон, вы просто ... исключите диапазон:

SELECT *,
      <distance_calculation> AS `distance` 
FROM `memb_geo_locations` 
ORDER BY `distance` ASC

Чтобы сформировать внутреннее соединение, вы делаете это, как обычно.

SELECT ...
FROM memb_geo_locations
INNER JOIN other_table
 ON memb_geo_locations.member_id = other_table.member_id
ORDER BY `distance` ASC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...