Выберите строки, используя группу и имеющие совокупную функцию
-
14-11-2019 - |
Вопрос
У меня есть стол, заполненные автобусными остановками.Каждая остановка имеет
Я хочу, чтобы мой запрос вернуть ближайшую остановку для каждой строки / направления.
.
SELECT * from stops GROUP BY CONCAT(line_id, direction)
Это запрос группы моих остановок, как и ожидалось.Это другая часть, которая задействована (возвращая ближайшую остановку), так как я рассчитываю расстояние на мухой с использованием (я заменил здесь некоторые переменные)
.
SQRT(POW(111.1819*(45.54182-lat),2)+POW(64.7938007101048*(-73.62934-lng),2))
Я пытался сделать внутреннее присоединение, но не удачи (я заменил формулу расстояния):
.
SELECT distance-formula as distance1, s1.* from stops s1 INNER JOIN
(SELECT MIN(distance-formula) AS distance2, line_id, direction FROM stops GROUP BY CONCAT(line_id, direction)) s2
ON (s1.line_id = s2.line_id AND s1.direction = s2.direction AND s1.distance1 = s2.distance2)
Но я продолжаю получать Unimal Column 'distance1' в «ON CLEASE» .
Я посмотрел в другие варианты, но тот факт, что расстояние рассчитывается в запросе, кажется, является настоящим выключателем.Каковы мои варианты?
Решение
Untested:
SELECT * FROM (SELECT distance-formula as distance1, line_id, direction from stops) s1 INNER JOIN (SELECT MIN(distance-formula) AS distance2, line_id, direction FROM stops GROUP BY CONCAT(line_id, direction)) s2 ON (s1.line_id = s2.line_id AND s1.direction = s2.direction AND s1.distance1 = s2.distance2)
Or (also untested):
SELECT distance-formula as distance1, s1.* from stops s1 INNER JOIN (SELECT MIN(distance-formula) AS distance2, line_id, direction FROM stops GROUP BY CONCAT(line_id, direction)) s2 ON (s1.line_id = s2.line_id AND s1.direction = s2.direction AND s1.distance - formula = s2.distance2)
You can't use the alias distance1 in your where or on clause unless its in a subquery like the first example.
Also, in the interest of speeding up your calculations, you don't need to take the square root of anything because sqrt(x) < sqrt(y) implies x < y