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



第一个查询工作正常。它从表'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);

问题是,正如Romain指出的那样,这样做成本很高。

这篇文章描述了一种通过两步过程来降低成本的算法。

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

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

最新更新