MySQL自联接以获得具有不同属性的两个地理上最接近的项目?

时间:2011-01-17 05:22:47

标签: mysql latitude-longitude self-join

我们在地图上有一张天气标记表,其中每种标记类型都是风或云。

对于每个云标记,我们希望找到最近风标记的“WindDir”字段值。似乎自我加入可以解决这个问题,但构建查询很困难。

以下是我们不正确的伪SQL。我们知道距离值将是我们想要的。我们只需要如何使查询找到每个云标记的最接近的风标记,以便我们可以获得风标记的“WindDir”值。

SELECT w1.ID AS ID, w1.Lat AS Lat, w1.Lng AS Lng, 
       w2.WindDir AS WindDir, 
       MIN(SQRT(POWER(ABS(w1.Lng - w2.Lng), 2) + POWER(ABS(w1.Lat - w2.Lat), 2))*60) AS Distance 
FROM Weather w1 WHERE w1.Marker="Cloud"
LEFT JOIN Weather w2 WHERE w2.Marker="Wind"
USING ID  

我们很感激任何有关制作有效版本的建议!

-Ken

1 个答案:

答案 0 :(得分:0)

你非常接近(基本上只是为语法重新排序)

SELECT w1.ID AS ID, w1.Lat AS Lat, w1.Lng AS Lng, 
       w2.WindDir AS WindDir, 
       (SQRT(POWER(ABS(w1.Lng - w2.Lng), 2) + POWER(ABS(w1.Lat - w2.Lat), 2))*60) AS Distance 
FROM Weather w1 LEFT JOIN Weather w2 USING (ID)
WHERE w1.Marker="Cloud" AND w2.Marker="Wind"
ORDER BY Distance DESC
LIMIT 1

假设您只想要最接近的结果,我添加了LIMIT 1来限制返回的内容。

另一方面,这种寻找两个纬度/经度对之间距离的方法即使是相当小的变化也不太可能给你带来好的结果。有一些近似这些距离的方法......