使用GROUP BY选择行,使用聚合函数选择HAVING

时间:2011-03-30 05:01:22

标签: mysql optimization group-by having

我有一张满是巴士站的桌子。每个站点都有 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 clause'错误中不断收到未知列'distance1'。

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

1 个答案:

答案 0 :(得分: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)&lt; sqrt(y)表示x < ÿ