2013-07-16 7 views
0

У меня есть две таблицы Cities_no_iata в этой таблице есть столбцы (CountryId, iata_code, широта, longtiute)как обновить по ближайшему числовому значению

Cities_iata эта таблица имеет столбцы (CountryId, iata_code, широта, longtiute)

Первая таблица содержит города, которые не iata_code так все строки в столбце iata_code равна нулю

Вторая таблица содержит города, которые имеют iata_code

так что я хочу, чтобы скопировать ближайший город iata_code в городе, который не iata_code, я думаю, чтобы сделать это 2 вещи

1- Ближайший (широта и долгота) для двух городов

2- То же CountryId для двух городов.

Update Cities_iata 
JOIN Cities_no_iata USING (CountryID) 
Where ABS(cities_iata.latitude)= ABS(Cities_no_iata.latitude) 
AND ABS(cities_iata.longitude)= ABS(Cities_no_iata.longitude) 
AND cities_iata.CountryID = Cities_no_iata.country_id 
set( Cities_no_iata.iata_code =cities_iata.iata_code); 

но не работает

+1

Вы должны использовать гораздо более сложную формулу для разработки ближайшего города. Ознакомьтесь с http://sylnsr.blogspot.co.uk/2012/12/find-nearest-location-by-latitude-and.html. Thats, что вы хотите делать – Lee

+0

этот код я хорошо, чтобы выбрать ближайший город, но как обновить из таблицы в другую таблицу – user1673473

ответ

2

Этот запрос приближается к расстоянию с помощью евклидовой формулы. На самом деле, даже для приближения, вы хотели бы учитывать, что разность единиц в широте отличается от долготы, в зависимости от широты - это требует умножения разности широт на косинус.

Однако я собираюсь предположить, что вопрос заключается в том, чтобы найти ближайший, а не конкретную формулу расстояния. Следующий запрос возвращает ближайший код ИАТА для городов в таблице с ни:

select cni.*, 
     (select iata_code 
     from cities_iata ci 
     order by pow(cia.latitude - ci.latitude, 2) + pow(cia.longitude - ci.longitude, 2) 
     limit 1 
     ) as new_iata_code 
from cities_no_iata cni; 

Мы можем превратить это в update с помощью join:

update cities_no_iata join 
     (select cni.*, 
       (select iata_code 
       from cities_iata ci 
       order by pow(cia.latitude - ci.latitude, 2) + pow(cia.longitude - ci.longitude, 2) 
       limit 1 
       ) as new_iata_code 
     from cities_no_iata cni 
     ) upd 
     on cities_no_iata.latitude = upd.latitude and 
      cities_no_iata.longitude = upd.longitude 
    set iata_code = upd.iata_code; 

Два комментарии. Вы можете поместить любую функцию расстояния, которая вам нравится, в предложении order by, поэтому это должно быть обобщено, чтобы быть тем, что вы хотите. Во-вторых, у вас должен быть уникальный идентификатор для каждой строки, поэтому окончательное соединение может быть выполнено как идентификатор города, а не по широте и долготе.

+0

я получаю эту ошибку # 1054 - Неизвестный столбец 'cia.latitude' в 'order clause' .. так что это точка cia? – user1673473

+0

У меня уже есть cittyid это уникальный идентификатор ?? .. и как его использовать? – user1673473

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