0

我的桌子上摆满了公交车站。每个停靠点都有一个line_id、一个方向坐标(lat 和 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))

我试过做一个 INNER JOIN 但没有运气(我已经替换了距离公式):

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)

但我在“on 子句”错误中不断收到未知列“distance1”。

我研究了其他选项,但在查询中计算距离这一事实似乎是一个真正的交易破坏者。我有哪些选择?我需要我的查询尽可能快。

4

1 回答 1

0

未经测试:

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)

您不能在 where 或 on 子句中使用别名 distance1 ,除非它像第一个示例那样在子查询中。

此外,为了加快计算速度,您不需要取任何东西的平方根,因为 sqrt(x) < sqrt(y) 意味着 x < y

于 2011-03-30T05:18:12.480 回答