У нас есть одна таблица метеорологических маркеров на карте, где каждый тип маркера - ветер или облако.
Для каждого облачного маркера мы хотим найти значение поля 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
Мы будем благодарны за любые советы по созданию версии, которая работает!
Кен
Вы довольно близки (в основном просто переупорядочены для синтаксиса)
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
, чтобы ограничить возвращаемое.
С другой стороны, этот метод нахождения расстояния между двумя парами лат/лон вряд ли даст вам хорошие результаты даже для довольно небольших изменений. Существуют методы приближения этих расстояний...
AND w2.Marker="Wind"
идти в предикатеLEFT JOIN
а не вWHERE
?ON
вместо выражения столбцаUSING
, ноWHERE
здесь уместно.