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

发布于 2024-12-08 02:29:23 字数 936 浏览 1 评论 0原文

第一个查询工作得很好。它从表“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);

The first query works just fine. It returns one row from the table 'routepoint'. It has a certain 'route_id' and 'geo_distance()' is on its minimum given the parameters. I know that the subquery in the FROM section seems unnecessarily complicated but in my eyes it helps to highlight the problem with the second query.

The differences are in the last two rows.

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

The next query does not work at all. It completely freezes mysql and I have to restart.
What am I doing wrong? The first subquery returns excactly one row. I don't understand the difference.

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

怕倦 2024-12-15 02:29:23

正如罗曼所指出的,问题在于这样做的成本高昂。

本文描述了一种将成本降低 2- 的算法步骤过程。

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

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

The problem is, as pointed out by Romain, that this is costly.

This article describes an algorithm that reduces the cost by a 2-step process.

Step 1: Find a bounding box that contains at least one point.

Step 2: Find the closest point by examining all points in the bounding box, which should be a comparatively small number, thus not so costly.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文