如何按最接近的数值更新

时间:2013-07-16 10:18:46

标签: mysql sql

我有两个表Cities_no_iata这个表有列(CountryID,iata_code,latitude,longtiute)

Cities_iata此表包含列(CountryID,iata_code,latitude,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 个答案:

答案 0 :(得分: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;

我们可以使用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子句中放置您喜欢的任何距离函数,因此这应该概括为您想要的。其次,每行应该有一个唯一的标识符,因此最终的连接可以使用城市标识符而不是纬度和经度。