需要帮助理解这个SQL

时间:2011-07-26 22:32:51

标签: mysql sql

我正在尝试破译此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}

7 个答案:

答案 0 :(得分:2)

这些是别名......

Aliases are powerful for complex queries that need to 
    use the same table twice but in different ways.

在此查询中,FROM子句指定表名的别名。别名位置z意味着位置表可以在查询的其他位置称为z。例如,z.zip_codelocation.zip_code相同。这样可以节省此查询的输入。

<强> REFERENCE

答案 1 :(得分:2)

这是

的简写
 locations AS z, locations AS o, locations AS a

或者换句话说,它们是别名。

原始作者不是继续在他们的代码中写locations,而是选择将它们变为简写,在本例中为z o和a。

另外,因为他使用相同的表三次,所以别名允许他区分每一个

答案 2 :(得分:2)

这是位置表的笛卡尔乘积本身,两次。由于查询与自身连接相同的表,因此需要重命名每个部分,以便稍后在查询中对它们进行唯一标识。 <{1}},zo就是那些名字。

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

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

修改以回应评论。我对此并不乐观,但在阅读完查询后,我相信它会找到所有与另一个邮政编码相距一定距离的邮政编码。它看起来像第三个笛卡尔积(位置a)甚至没有被使用,所以你可以将查询减少到:

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}

MySQL可能会很好地优化

答案 3 :(得分:1)

  • z使用#{zip_code}(参考点)保存您查找的记录

  • a与z

  • 的记录相同
  • o包含#{distance}

  • 地理距离内的所有记录

简而言之:

它会找到所有位于z

周围#{distance}半径的圆圈中的邮政编码

顺便说一句,3956是地球的半径(大约),所以你得到的结果将是英里;)

如果您对此感兴趣,可以在http://www.movable-type.co.uk/scripts/gis-faq-5.1.html

上阅读更多内容

答案 4 :(得分:0)

看起来它试图选择邮政编码$ {zip_code}的#{distance}内的所有邮政编码。

我认为他的帖子很好地解释了用于此目的的余弦定律:http://blog.cleverly.com/archive/2000-03.html

z,o和a是别名,因为同一个表连接了3次。

答案 5 :(得分:0)

这些是表格名称的简写,而不是键入locations.zip_code,它缩写为a.zip_code

这也有助于这个例子,因为从3次中选择了相同的表格。

答案 6 :(得分:0)

这些字母是表别名,它们本质上是SQL开发人员给出位置表的昵称。使用三个不同的名称将相同的位置表连接在一起,因为它是一个表来区分位置表的不同用途

地点已重命名为z, 位置已重命名为o, 位置已重命名为

将z更改为locations1 将o更改为locations2 并将a更改为locations3,如果这有助于您阅读SQL