MYSQL:如何在子查询中正确使用外部别名?

时间:2011-10-03 10:41:26

标签: mysql query-optimization subquery alias

第一个查询工作正常。它从表'routepoint'返回一行。它有一个'route_id'和'geo_distance()'在给定参数的最小值。我知道FROM部分中的子查询似乎不必要地复杂,但在我看来,它有助于突出第二个查询的问题。

差异在最后两行。

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);

1 个答案:

答案 0 :(得分:1)

正如Romain所指出的那样,问题是成本高昂。

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

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

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