Вычислить расстояние между 400 городами и оптимизировать MySQL для этого? - PullRequest
0 голосов
/ 27 октября 2011

У меня есть база данных около 400 городов.Пользователь выбирает город, в котором он живет, и вводит расстояние, которое он желает пройти (например, 40 километров).City_id сохраняется в поисковой таблице вместе с другой не относящейся к делу информацией.Когда пользователь отправляет форму, он перенаправляется на страницу результатов, на которой отображаются все результаты из таблицы поиска, которые соответствуют критериям, но я хочу упорядочить их по расстоянию между городом пользователя формы города и городом результатов и упорядочить результатына этом расстоянии (ближайший первым).Как бы я посчитал расстояние между городами, а потом заказал их?Какие таблицы мне нужно добавить к каждому городу, чтобы я мог рассчитать расстояние, и есть ли какой-нибудь способ, которым я мог бы просто запустить цикл, который бы находил координаты каждого города и сохранял их?В моей текущей таблице городов указаны только id, name и zip

. Любая помощь будет признательна.

Ответы [ 2 ]

4 голосов
/ 27 октября 2011

Я видел два возможных решения.

Первый:
Для каждого магазина города в базе данных указаны его широта и долгота;когда пользователь получает запрос, вы вычисляете расстояние с каждым другим городом и возвращаете результаты.
Pro - вы можете добавить каждый город в дБ без необходимости добавлять другую информацию.
Здесь вы можете найтиформулы, образцы и код тоже для вычисления расстояния широта-долгота ...

Секунда:
Создайте таблицу cities_dist с тремя полями: city1_id, city2_id, distance и поместите в каждое возможноесочетание среди ваших городов.При этом вы можете написать запрос с выбранным городом, например, city1_id или city2_id.
Преимущество заключается в том, что вы можете использовать простой запрос без калькуляции, в то время как минусы в том, что вам нужно заполнять эту таблицу каждый раз, когда вы вставляете новый город в базу данных.

ИЗМЕНЕНО после комментария пользователя:
Представьте, что у вас есть три города

ID  NAME
1   New York
2   Rome
3   Berlin

Эта таблица должна выглядеть как

CITY1  CITY2  DIST
1      2      1500
1      3      1200
2      3       400

Когдапользователь хочет лететь из Берлина, вы можете использовать

SELECT c1.name, c2.name, cd.dist 
FROM cities_dist cd
  INNER JOIN cities c1 ON cd.city1 = c1.id
  INNER JOIN cities c2 ON cd.city2 = c2.id
WHERE cd.city1 = your_id
   OR cd.city2 = your_id
ORDER BY cd.dist ASC
1 голос
/ 27 октября 2011

В зависимости от того, насколько точными должны быть результаты, проще всего сохранить широту / долготу (географические координаты) в качестве дополнительных столбцов для каждого города.

Чтобы получить расстояние, просто используйте Пифагор (или более точный геоформула, которая учитывает поверхность земли):

distance = sqrt((city.x - my_x)^2 + (city.y - my_y)^2)

Поместите это в ваше предложение WHERE, и вы получите расстояние до воздушной линии.

Есть более сложныеспособов предварительно рассчитать все расстояния, но для вас этого будет достаточно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...