在实际开发场景中我们经常会碰到类似美团饿了么的根据距离推荐商家的业务,我们可以直接使用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去掉