在MYSQL中获取10km距离的记录

Posted

技术标签:

【中文标题】在MYSQL中获取10km距离的记录【英文标题】:Fetch records with 10km of distance in MYSQL 【发布时间】:2017-04-29 08:06:58 【问题描述】:

我在 mysql 中有表以及 lat & lon 值。

我想在当前纬度和经度的上下文中获取半径 10 公里内的用户。

我正在尝试以下查询,但它给了我空的输出。

SELECT
`id`,
`name`,
ACOS( SIN( RADIANS( `latitude` ) ) * SIN( RADIANS( $fLat ) ) + COS( RADIANS( `latitude` ) )
* COS( RADIANS( $fLat )) * COS( RADIANS( `longitude` ) - RADIANS( $fLon )) ) * 6380 AS `distance`
FROM `users`
WHERE
ACOS( SIN( RADIANS( `latitude` ) ) * SIN( RADIANS( $fLat ) ) + COS( RADIANS( `latitude` ) )
* COS( RADIANS( $fLat )) * COS( RADIANS( `longitude` ) - RADIANS( $fLon )) ) * 6380 < 10
ORDER BY `distance`

其中纬度和经度是列名,$fLat 和 $fLon 是当前的纬度和经度值。

【问题讨论】:

见meta.***.com/questions/333952/… MySQL Great Circle Distance (Haversine formula)的可能重复 你可以尝试在php中进行计算 对一个距离 >= 10 和几个小于 10 的测试数据库进行一些测试。使用网络上的距离计算器来获得正确的距离。与没有 where 子句的 SQL 进行比较。找出问题所在。 我很确定 6380 是错误的因素。关注 [latitude-longitude] 标签,了解有关该主题的许多讨论,以及许多公式(其中大部分是正确的)。 【参考方案1】:

使用此查询您的问题将得到解决:

SELECT `id`, `name`, `phone`, `latitude`, `longitude`, SQRT( POW(69.1 * (`latitude` - 24.900363), 2) + POW(69.1 * (67.099760 - `longitude`) * COS(`latitude` / 57.3), 2))
AS `distance`
FROM `users` HAVING `distance` < 25
ORDER BY `distance`

【讨论】:

您好,欢迎来到 ***,感谢您的回答!但是,恐怕您的答案格式不正确,使代码几乎无法阅读。您能否请edit您的问题并在您的代码周围包含```标签以将其格式化为代码以使其更易读?此外,仅代码答案不是最佳实践,您能否还包括一个简短的解释,说明您解决了什么问题以及您是如何解决的?

以上是关于在MYSQL中获取10km距离的记录的主要内容,如果未能解决你的问题,请参考以下文章

MySQL查询优化从大表中获取8-10条记录

MySQL - 获取最长字符串匹配的记录

GeoDjango 获取到给定位置集的任何点的给定距离内的模型的所有记录

MySQL高效获取记录总数

使用 NodeJS 在 mySQL 中插入多条记录以防止注入并获取每条记录的 ID

邮政编码之间的距离