Mysql

進行連接以搜尋區域中的地理位置點

  • June 11, 2014

我在一個表中有一系列地理定位點,在另一個表中有一系列“區域”;我想做一個連接來確定每個點屬於哪個區域(如果有的話。)

積分錶如下所示:

+--+--------+---------+
|id|Latitude|Longitude|
+--+--------+---------+
| 1|37.23221|-81.32323|
+--+--------+---------+    
| 2|36.92321|-81.12423|
+--+--------+---------+
| etc                 |
+--+--------+---------+      

區域表如下所示:

+--+------+------+------+-----+-----+
|id|Name  |LONG_E|LONG_W|LAT_N|LAT_S|
+--+------+------+------+-----+-----+
| 1|Zone 1| -81.0| -82.0| 38.0| 37.0|
+--+------+------+------+-----+-----+
| 2|Zone 2| -81.0| -82.0| 37.0| 36.0|
+--+------+------+------+-----+-----+
| etc                               |
+--+------+------+------+-----+-----+

我希望能夠查詢點表並加入區域表,以獲得如下所示的結果:

+----+----------+-----------+----+------+
|p.id|p.latitude|p.longitude|z.id|z.name|
+----+----------+-----------+----+------+
|   1|  37.23221|  -81.32323|   1|Zone 1|
+----+----------+-----------+----|------+    
|   2|  36.92321|  -81.12423|   2|Zone 2|
+----+----------+-----------+----+------+
|etc                                    |
+----+----------+-----------+----+------+ 

我對我的 SQL 語法很生疏,所以我想知道這是否可能……我正在使用 MySQL BTW。謝謝!

這應該這樣做:

SELECT p.id, latitude, longitude, z.id, z.name
 FROM points p
 LEFT JOIN zones z
   ON ( latitude BETWEEN LAT_S AND LAT_N
         AND
        longitude BETWEEN LONG_W AND LONG_E ) ;

$$ EDIT $$ 根據您的評論,假設您想在points表中添加一個 FK 列,將點與其區域 ID 相關聯。不建議這樣做有一些原因,例如,如果您的區域邊界可能會改變,您將獲得不正確/不一致的數據。但是對於原始性能,也許您希望將區域 id 非規範化到points表中,記住它就像一個記憶體的區域 id。如果您有兩個區域重疊,MIN()操作員會在那裡保護您。在這種情況下,您會遇到更大的問題,但至少可以UPDATE正常工作,並通過法定貨幣選擇較低的區域 id。

ALTER TABLE points ADD (zone_id int references zone(id));

UPDATE points SET zone_id = 
( SELECT MIN(z.id)
 FROM zones z
 WHERE latitude BETWEEN LAT_S AND LAT_N
         AND
       longitude BETWEEN LONG_W AND LONG_E
);

引用自:https://dba.stackexchange.com/questions/68076