2011-10-03 214 views
2

第一个查询工作得很好。它从表'路线点'返回一行。它有一个特定的'route_id','geo_distance()'在给定参数时处于最小值。我知道FROM部分中的子查询似乎不必要的复杂,但在我看来,它有助于突出第二个查询的问题。MYSQL:如何正确使用子查询中的外部别名?

区别在最后两行。

SELECT rp.* 

FROM routepoint rp, route r, (SELECT * FROM ride_offer WHERE id = 6) as ro 

WHERE rp.route_id = r.id 
AND r.id = ro.current_route_id 
AND geo_distance(rp.lat,rp.lng,52372070,9735690) = 

(SELECT MIN(geo_distance(lat,lng,52372070,9735690)) 
FROM routepoint rp1, ride_offer ro1 
WHERE rp1.route_id = ro1.current_route_id AND ro1.id = 6); 

下一个查询根本不起作用。它完全冻结MySQL,我必须重新启动。 我在做什么错?第一个子查询返回一行。我不明白区别。

SELECT rp.* 

FROM routepoint rp, route r, (SELECT * FROM ride_offer WHERE id = 6) as ro 

WHERE 
rp.route_id = r.id 
AND r.id = ro.current_route_id 
AND geo_distance(rp.lat,rp.lng,52372070,9735690) = 

(SELECT MIN(geo_distance(lat,lng,52372070,9735690)) 
FROM routepoint rp1 
WHERE rp1.route_id = ro.current_route_id); 
+0

路线点表有多大?另外,您是否比较了两个陈述的执行计划? –

+1

您正在尝试编写依赖子查询 - 子查询将在外部查询结果集的每一行执行一次,如果您有很多行,这将会非常慢 - 您会希望尽可能多地优化子查询尽你所能。 – Romain

+0

@Klas路线点表有大约14k行,它会变得更大。 – Nielow

回答

1

问题是,正如罗曼指出的那样,这是昂贵的。

This article描述了一种通过两步过程降低成本的算法。

步骤1:找到至少包含一个点的边界框。

步骤2:通过检查边界框中的所有点来找出最接近的点,这应该是一个相对较小的数字,因此并不那么昂贵。

相关问题