2017-06-06 365 views
1

我正在使用MySQL 5.5.52。縮寫:Lat =緯度,Long =經度,NE =東北,SW =西南。經緯度長度在經緯度範圍內

我有兩個SQL表格:

第一個表格包含「區域」。每個區域由ID,NE Lat,NE Long,SW Lat,SW Long組成。

第二個表格包含「點」。每個點由ID,Lat,Long組成。

我需要給定區域ID列表將在這些地區返回點的SQL語句。如果一個點的Lat-Long位於由區域的NE Lat-Long和SW Lat-Long定義的右上角和左下角的平方內,則該點定義在Area中。

注意:我可以將區域更改爲具有半徑的單個經緯度長度,其中點位於「圓圈」內。但理想情況下,我不想這樣做,除非有更高效的SQL語句來解決這個問題。

+0

所以像這樣:'WHERE(Points.Lat> Areas.SWLat AND Points.LAT Areas.SWLong AND Points.Long

+0

簡而言之,我從未在數據庫中存儲空間數據,也不知道最佳方式。 RKRC的答案似乎爲我做了這份工作。按照你的方式(在where子句而不是聯接中)有沒有優勢? – AndyW

+0

對於所有意圖和目的,它們(通常)都是相同的東西。 '之間'是包含性的,所以它是<= and > =。至於加入ON與WHERE,他們通常是相同的執行。 –

回答

1

加入兩個表基於條件點位置屬於區域範圍內。

Select areaTable.*, pointsTable.* 
From pointsTable 
Join areaTable 
On pointTable.lat between areaTable.SWLat and areaTable.NELat 
and 
pointTable.long between areaTable.SWLong and areaTable.NELong 

給你每個區域和相應的點。

如果需要,可以使用where子句進一步參數化特定區域。

Where [email protected] 
and [email protected] 
and [email protected] 
and [email protected] 

只需用您喜歡的lat和long值替換@s即可。

+0

這似乎工作!然而,對於我的where子句,我只是在'where areaTable.id in(1,2,3 ...)'這似乎產生了期望的結果,這是個好主意嗎? – AndyW

+0

是的。這是做到這一點的方法。如果一切順利,請不要忘記標記爲已接受的答案 – RKRC