2013-07-16 62 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城市,我認爲兩件事

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。這就是你想要做的 – Lee

+0

這段代碼我很好地選擇最接近的城市,但如何從表更新到另一個表 – user1673473

回答

2

此查詢近似於使用歐幾里得式的距離。實際上,即使對於近似值,您也要考慮緯度的單位差異與經度的不同,這取決於緯度 - 這需要將緯度差乘以餘弦。

但是,我將假設這個問題是關於找到最接近的問題,而不是關於具體的距離公式。下面的查詢返回最近的IATA代碼與沒有在表中的城市:

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; 

我們可以使用join把它變成一個update

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'..所以什麼是cia點? – user1673473

+0

我已經有cittyid是這個唯一的標識符?? ..以及如何使用它? – user1673473