小编典典

选项1:通过切换到支持GeoIP的数据库对数据库进行计算。

选项2:使用如下存储过程对数据库进行计算:

CREATE FUNCTION calcDistance (latA double, lonA double, latB double, LonB double)

RETURNS double DETERMINISTIC

BEGIN

SET @RlatA = radians(latA);

SET @RlonA = radians(lonA);

SET @RlatB = radians(latB);

SET @RlonB = radians(LonB);

SET @deltaLat = @RlatA - @RlatB;

SET @deltaLon = @RlonA - @RlonB;

SET @d = SIN(@deltaLat/2) * SIN(@deltaLat/2) +

COS(@RlatA) * COS(@RlatB) * SIN(@deltaLon/2)*SIN(@deltaLon/2);

RETURN 2 * ASIN(SQRT(@d)) * 6371.01;

END//

如果您的数据库中有一个关于纬度和经度的索引,则可以通过计算PHP中的初始边界框($ minLat,$ maxLat,$ minLong和$

maxLong)并限制来减少需要计算的数量。根据该行($ minLat和$ maxLat之间的纬度以及$ minLong和$

maxLong之间的经度)将这些行添加到您的条目子集。然后,MySQL只需要为该行子集执行距离计算。

如果您只是使用存储过程来计算距离,则SQL仍然必须遍历数据库中的每个记录,并计算数据库中每个记录的距离,然后才能决定是返回该行还是丢弃该行。

由于计算的执行速度相对较慢,因此最好减少需要计算的行的集合,从而消除明显落在所需距离之外的行,因此我们仅对以下情况执行昂贵的计算:行数较少。

如果您认为自己所做的基本上是在地图上绘制一个以初始点为中心并具有一定距离半径的圆;那么该公式仅会确定哪些行属于该圆…但是它仍然必须检查每一行。

使用边界框就像先在地图上绘制一个正方形,然后将左,右,上和下边缘与我们的中心点保持适当的距离。然后,我们将在该框中绘制圆,使圆上的最北,最东,最南和最西点与框的边界接触。一些行将落在该框的外面,因此SQL甚至不必费心尝试计算这些行的距离。它仅计算落入边界框内的行的距离,以查看它们是否也落入圆内。

在您的PHP中(假设您正在使用$变量名运行PHP),我们可以使用一个非常简单的计算方法,根据我们的距离计算出最小和最大纬度和经度,然后在SQL的WHERE子句中设置这些值声明。这实际上是我们的盒子,落在盒子外面的任何东西都会自动丢弃,而无需实际计算其距离。

在Movable Type网站上对此有很好的解释(带有PHP代码),对于打算用PHP进行任何GeoPositioning工作的任何人来说,这都是必不可少的阅读材料。

编辑 calcDistance存储过程中的值6371.01是乘数,以公里为单位返回结果。如果您想得出英里,海里,米等的数值,请使用适当的替代乘数

2020-05-17

mysql语句计算距离_mysql查询中的距离计算相关推荐

  1. mysql for 语句执行顺序_MySQL查询语句的执行流程

    MySQL可以抽象分为 Server 和存储引擎. Server 包括 连接器,分析器,优化器,执行器等. 存储引擎负责数据的存储和具体查询.存储引擎是可插拔式的,支持 InnoDB,MyISAM 等 ...

  2. 在mysql中通配符_mysql查询中通配符的使用

    mysql查询中通配符的使用 在mysql查询中经常会使用通配符,并且mysql的通配符和pgsql的存在区别(稍候再讨论),而且mysql中还可以使用正则表达式. SQL模式匹配: "_& ...

  3. mysql 查看数据库函数_MySQL数据库中常用查询函数简介

    MYSQL中的常用函数 count(*)--- 相当于统计表的行数,在统计结果的时候,不会忽略列值为NULL的记录. select count(*) from yinxiong; Count(列名) ...

  4. mysql 循环创建列_mysql – 查询列中的循环值

    我需要创建一个查询,一次只将一列的值移动一行↑: +------------+----------------+ | anotherCOL | values_to_loop | +---------- ...

  5. mysql _ 通配符_mysql查询中通配符的使用

    在mysql查询中经常会使用通配符,并且mysql的通配符和pgsql的存在区别(稍候再讨论),而且mysql中还可以使用正则表达式. SQL模式匹配: "_" 匹配单个字符,&q ...

  6. mysql先分组后排序语法_mysql查询中oder by 和group by 的问题【要先分组再排序】

    做网上的mysql语句练习题,题目如下, -- 13.查询和"01"号的同学学习的课程完全相同的其他同学的信息 我写的mysql语句如下, SELECT student.`*` F ...

  7. mysql 一周一月_mysql查询当天、本周,本月,上一个月的数据

    今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ...

  8. mysql 语句性能分析_mysql的sql语句的性能诊断分析

    1> explain SQL,类似于Oracle中explain语句 例如:explain select * from nad_aditem; 2> select benchmark(co ...

  9. mysql 语句块语法_MySQL ------ MySQL常用语句的语法 (三十四)

    MySQL常用的语句语法 注意:1. | 符号用来指出几个选中中的一个,因此NULL | NOT NULL 表示给出null 或 not null 2.包含在方括号中的关键字或子句是可选的(如 [li ...

最新文章

  1. ASP.NET MVC5+EF6+EasyUI 后台管理系统(50)-Easyui 扁平化皮肤
  2. 一位技术人员成长的烦恼及我的分析(转)
  3. WINDOWS 下编译ace
  4. 多边形的时针方向与法线方向
  5. spring学习(14):Autowired的使用场景
  6. 用任意合法序列建立一棵二叉树(洛谷P1305题题解,Java语言描述)
  7. 阿里云MVP:如何设计实现一个通用的微服务架构?
  8. extjs 关闭弹出窗口_【实用工具】一键关闭/开启Windows防火墙、禁止更新系统
  9. php网页电话外呼,一种基于web网页端的电话外呼方法与流程
  10. labview用户登录与管理界面设计
  11. 个人SEO成长指南:该怎么开启你的SEO业务
  12. 【GitHub前端练手项目--50天50个项目---商品加载效果-----day08】
  13. IPHONE屏幕大小,分辨率解析
  14. BD NetDisk不限速下载,某度网盘不限速下载,跑满带宽,网盘下载器,网盘高速下载器,不限速网盘下载,AntNetDiskDownloader
  15. 怎么合并或注销重复LinkedIn领英帐号?
  16. ospf协议(包含负载分担)
  17. Win11全新功能来袭!每天都有新亮点!
  18. 程序员进阶攻略笔记01-10
  19. 电子商务网站设计的艺术
  20. 新媒体广告投放的知识要点解析

热门文章

  1. 医疗器械经营许可证,您了解多少?
  2. 简单容易的计算机音乐,简单易上手的小型音乐制作软件 1BITDRAGON 升级 2.0
  3. 牛客小白月赛63->GCPC总决赛,递归方法求解
  4. 银行业务名词释义(未完善)
  5. 行政服务中心大厅3D导航引导系统建设方案
  6. 360搜索引擎数据抓取
  7. 【网络协议详解】——GNS3的使用(学习笔记)
  8. Excel file format cannot be determined, you must specify an engine manually
  9. php 微信分享功能_基于thinkPHP实现的微信自定义分享功能
  10. 微信小程序开发之——音乐播放器-音乐推荐