栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

SQL Abs计算

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SQL Abs计算

纬度/经度坐标之间的距离的解决方案称为Haversine公式。这很复杂,因为除非您的距离很短,否则您需要考虑地球的曲率。

这是有关使用PHP和MySQL实施定位器应用程序的文章: 使用PHP,MySQL和Google
Maps创建商店定位器

如果您只需要计算5公里以内的距离,那么地球的曲率可能并不重要。您可以使用普通距离公式。如果只需要使用此值来排序较接近的值,则甚至可以跳过平方根计算。

SELECt s.location_id,  (s.lat-p.lat)*(s.lat-p.lat) + (s.long-p.long)*(s.long-p.long) AS distance_squaredFROM Locations s, Locations pWHERe p.location_id = ?ORDER BY distance_squared;

我从中选择的表(“位置”)具有经/纬度坐标(我们称它们为$ plat和$ plong)。

不,这些是PHP变量。您需要从数据库表的每一行上的纬度/经度坐标计算距离。

问题是,SQL通常只从计算的东西 一个 在同一时间行。因此,您需要某种方式将两行合并为一行,以便计算可以使用两个位置的坐标。您可以通过 self-
join

进行此操作。这基本上是将每一行与同一表中的另一行配对。这就是为什么我列出

Locations
两次,并给他们两个不同的别名,
s
p
(技术术语是“
相关名称” )的原因。

如果您习惯使用PHP,则可以将这种自联接与嵌套循环类似:

foreach ($locations as &$s) {    foreach ($locations as &$p) {        // calculate the distance between $s and $p    }}

WHERe
子句将的行限制为
p
您仅从其开始的位置(您将用?占位符替换一个值),因此查询与表的所有行都只有一行。

另一个提示:我跳过了使用,

SQRT()
因为不必仅按距离排序。也就是说,如果三个位置距离我10公里,15公里和20公里,那么我可以按100、225和400进行排序,并获得与我按10、15和20进行排序相同的排序。优点是,我消除了计算平方根的步骤,这在某种程度上降低了我的查询成本。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/382201.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号