MySQL самостоятельно соединится, чтобы получить два географически ближайших элемента с разными свойствами? - PullRequest
0 голосов
/ 17 января 2011

У нас есть одна таблица маркеров погоды на карте, где каждый тип маркера - ветер или облако.

Для каждого маркера облака мы хотим найти значение поля «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 голосов
/ 17 января 2011

Вы довольно близки (в основном просто переупорядочены по синтаксису)

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, чтобы ограничить то, что возвращается.

Кстати, этот метод определения расстояния между двумя парами широта / долгота вряд ли даст вам хорошие результаты даже при довольно небольших изменениях. Есть методы для аппроксимации этих расстояний ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...