第一个查询工作正常。它从表'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);
答案 0 :(得分:1)
正如Romain所指出的那样,问题是成本高昂。
This article描述了一种通过两步过程降低成本的算法。
步骤1:找到包含至少一个点的边界框。
步骤2:通过检查边界框中的所有点来找到最近的点,这应该是一个相对较小的数字,因此不会太昂贵。