0

2 つのテーブル Cities_no_iata があります。このテーブルには列 (CountryID、iata_code、latitude、longtiute) があります。

Cities_iata このテーブルには列があります (CountryID、iata_code、latitude、longtiute)

最初のテーブルには、iata_code を持たない都市が含まれているため、iata_code 列のすべての行は null です。

2 番目のテーブルには、iata_code を持つ都市が含まれています。

だから私は最も近い都市iata_codeをiata_codeを持っていない都市にコピーしたい、私はこれを2つのことで行うと思う

1- 2 つの都市の最も近い (緯度と経度)

2- 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);

しかし、動作しません

4

1 に答える 1

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これをusingに変えることができます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;

2 つのコメント。任意の距離関数をorder by句に入れることができるため、これは一般化して必要なものになるはずです。第 2 に、各行に固有の ID が必要です。最終的な結合は、緯度と経度ではなく、都市の ID で行うことができます。

于 2013-07-16T11:00:07.373 に答える