Выберите строки, используя группу и имеющие совокупную функцию

StackOverflow https://stackoverflow.com/questions/5482052

Вопрос

У меня есть стол, заполненные автобусными остановками.Каждая остановка имеет LINE_ID , направление и координаты (lat and lng).

Я хочу, чтобы мой запрос вернуть ближайшую остановку для каждой строки / направления.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top