Выберите строки, используя GROUP BY и HAVING с агрегатной функцией - PullRequest
0 голосов
/ 30 марта 2011

У меня есть стол, заполненный автобусными остановками. Каждая остановка имеет line_id , направление и координаты (широта и долгота).

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

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)

Но я продолжаю получать Неизвестный столбец «distance1» в «on оговорке» error.

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

1 Ответ

0 голосов
/ 30 марта 2011

Не проверено:

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)

Или (также не проверено):

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)

Вы не можете использовать псевдоним distance1 в предложении where или on, если только он не находится в подзапросе, таком какпервый пример.

Кроме того, в целях ускорения ваших вычислений вам не нужно брать квадратный корень чего-либо, потому что sqrt (x)

...