gpt4 book ai didi

mysql - 需要帮助理解这个 sql

转载 作者:行者123 更新时间:2023-12-01 00:14:46 25 4
gpt4 key购买 nike

我正在尝试破译这条 SQL 语句。具体来说,位置 z、位置 o、位置 a 是什么意思。在这种情况下,z o 和 a 是什么意思?困惑:(

SELECT o.zip_code
FROM locations z, locations o, locations a

WHERE z.zip_code = #{zip_code}
AND z.zip_code = a.zip_code
AND (3956 * (2 * ASIN(SQRT(
POWER(SIN(((z.latitude-o.latitude)*0.017453293)/2),2) +
COS(z.latitude*0.017453293) *
COS(o.latitude*0.017453293) *
POWER(SIN(((z.longitude-o.longitude)*0.017453293)/2),2)
)))) <= #{distance}

最佳答案

这是位置表与自身的笛卡尔积,两次。由于查询将同一个表与自身连接起来,因此需要重命名每个部分,以便稍后在查询中可以唯一地标识它们。 zoa 就是这些名称。

看例子二here (http://www.fluffycat.com/SQL/Cartesian-Joins/)看看发生了什么。除了在这种情况下,有两个笛卡尔积而不是一个。都在同一张 table 上。

查询本身可能会非常慢,因为它正在执行双笛卡尔积,它将创建一个包含 n³ 行和 (3m) 列的临时表,其中 n 是位置表中的行数,m 是位置表中的行数列。

编辑 回应评论。我对此并不肯定,但在阅读您的查询后,我相信它正在查找与另一个邮政编码有一定距离的所有邮政编码。看起来甚至没有使用第三个笛卡尔积(位置 a),因此您可以将查询减少为:

SELECT o.zip_code
FROM locations z, locations o

WHERE z.zip_code = #{zip_code}
AND (3956 * (2 * ASIN(SQRT(
POWER(SIN(((z.latitude-o.latitude)*0.017453293)/2),2) +
COS(z.latitude*0.017453293) *
COS(o.latitude*0.017453293) *
POWER(SIN(((z.longitude-o.longitude)*0.017453293)/2),2)
)))) <= #{distance}

但是那仍然有一个笛卡尔积。如果我们能摆脱它会更好:

SELECT zip_code
FROM locations

WHERE (3956 * (2 * ASIN(SQRT(
POWER(SIN((((SELECT latitude FROM locations WHERE zip_code = #{zip_code})-latitude)*0.017453293)/2),2) +
COS((SELECT latitude FROM locations WHERE zip_code = #{zip_code})*0.017453293) *
COS(latitude*0.017453293) *
POWER(SIN((((SELECT longitude FROM locations WHERE zip_code = #{zip_code})-longitude)*0.017453293)/2),2)
)))) <= #{distance}

可能会被 MySQL 很好地优化

关于mysql - 需要帮助理解这个 sql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6837413/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com