2011-03-30 64 views
0

我有一张充满公共汽车站的表格。每个站点具有line_id方向坐标(lat和lng)。使用GROUP BY和HAVING选择具有聚合函数的行

我想我的查询返回每条线/方向最近的站点。

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

该查询按预期对我的站点进行分组。这是另一部分这是tricker(返回最近的车站),因为我计算上使用飞的距离(我换成这里的一些变量)

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) 

但我不断收到“接通条款”错误未知列“距离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) 

您不能使用别名距离1你在那里或条款,除非它像第一个例子中的子查询。

而且,在加快你的计算的利息,则不需要采取任何事物的平方根,因为开方(x)的<的sqrt(Y)意味着X <Ÿ

+0

,首先询问的伎俩。好的呼叫sqrt,谢谢! – samvermette 2011-03-30 17:50:01