Pergunta

Eu tenho uma mesa cheia de paradas de ônibus.Cada parada tem um line_id, um direção e coordenadas (lat e lng).

Eu quero a minha consulta para retornar o mais próximo de parada para cada linha/direção.

SELECT * from stops GROUP BY CONCAT(line_id, direction)

Que grupos de consulta do meu pára conforme o esperado.É a outra parte que é mais complicada (retornando a paragem mais próxima), desde que eu estou calculando a distância na mosca usando (troquei algumas variáveis aqui)

SQRT(POW(111.1819*(45.54182-lat),2)+POW(64.7938007101048*(-73.62934-lng),2))

Eu tentei fazer um INNER JOIN, mas sem sorte (eu já substituiu a fórmula da distância):

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)

Mas eu continuo recebendo um Desconhecido coluna 'distance1' no 'na cláusula' erro.

Eu olhei para outras opções, mas o fato de que a distância é calculada dentro da consulta parece ser um real deal-breaker.Quais são minhas opções? Eu preciso da minha consulta para ser o mais rápido possível.

Foi útil?

Solução

Testado:

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)

Ou (o que também não testado):

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)

Você não pode usar o alias distance1 em seu domicílio ou em cláusula, a menos que o seu em uma subconsulta como o primeiro exemplo.

Também, no interesse de acelerar os cálculos, você não precisa tirar a raiz quadrada de qualquer coisa, porque sqrt(x) < sqrt(y) implica x < y

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top