我正在尝试破译此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}
答案 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_code
与location.zip_code
相同。这样可以节省此查询的输入。
<强> REFERENCE 强>
答案 1 :(得分:2)
这是
的简写 locations AS z, locations AS o, locations AS a
或者换句话说,它们是别名。
原始作者不是继续在他们的代码中写locations
,而是选择将它们变为简写,在本例中为z o和a。
另外,因为他使用相同的表三次,所以别名允许他区分每一个
答案 2 :(得分:2)
这是位置表的笛卡尔乘积本身,两次。由于查询与自身连接相同的表,因此需要重命名每个部分,以便稍后在查询中对它们进行唯一标识。 <{1}},z
和o
就是那些名字。
查看示例二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