Mysql
進行連接以搜尋區域中的地理位置點
我在一個表中有一系列地理定位點,在另一個表中有一系列“區域”;我想做一個連接來確定每個點屬於哪個區域(如果有的話。)
積分錶如下所示:
+--+--------+---------+ |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 );