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

0

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

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

Мы будем благодарны за любые советы по созданию версии, которая работает!

Кен

Теги:
latitude-longitude
self-join

1 ответ

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

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

  • 0
    AND w2.Marker="Wind" идти в предикате LEFT JOIN а не в WHERE ?
  • 0
    @ The Scrum Meister: я не верю в это, посмотрите следующую ссылку на синтаксис: dev.mysql.com/doc/refman/5.0/en/join.html . Можно использовать условное выражение ON вместо выражения столбца USING , но WHERE здесь уместно.
Показать ещё 9 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню