mysql根据经纬度计算距离并排序

在实际开发场景中我们经常会碰到类似美团饿了么的根据距离推荐商家的业务,我们可以直接使用mysql自带的函数来计算距离并排序

比如我有商家表如下所示

CREATE TABLE `t_store` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT 'id',
  `store_name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商户名称',
  `longitude` decimal(20,6) DEFAULT NULL COMMENT '经度',
  `latitude` decimal(20,6) DEFAULT NULL COMMENT '纬度',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

我们想根据用户的经纬度来计算与商家距离并保存为distance字段,然后根据此字段排序

因为地球并不是一个规则的球体,所以此方法只是大致的求出两点间距离

代码:

SELECT
	*,
	ROUND(
		6378.138 * 2 * ASIN(
			SQRT(
				POW(
					SIN((
							37.921289 * PI()/ 180-latitude * PI()/ 180 
							)/ 2 
					),
					2 
					)+ COS( 37.921289 * PI()/ 180 )* COS( latitude * PI()/ 180 )* POW(
					SIN((
							112.648139 * PI()/ 180-longitude * PI()/ 180 
							)/ 2 
					),
					2 
				)))* 1000 
	) AS distance 
FROM
	t_store 
ORDER BY
	distance ASC

查询结果如下:

 单位为m,如果想变为km的话可以将SQL语句中的 *1000去掉

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodeXu_cyber

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值