[英]how to update by the closest numeric value
我有兩個表Cities_no_iata這個表有列(CountryID,iata_code,latitude,longtiute)
Cities_iata此表包含列(CountryID,iata_code,latitude,longtiute)
第一個表包含沒有iata_code的城市,因此iata_code列中的所有行都為null
第二個表包含具有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);
但是不行
該查詢使用歐幾里德公式近似距離。 實際上,即使是近似值,您也需要考慮緯度的單位差異與經度的不同,具體取決於緯度 - 這需要將緯度差乘以余弦。
但是,我將假設問題實際上是找到最接近的,而不是特定的距離公式。 以下查詢返回表中沒有的城市最近的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
子句中放置您喜歡的任何距離函數,因此這應該概括為您想要的。 其次,每行應該有一個唯一的標識符,因此最終的連接可以使用城市標識符而不是緯度和經度。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.