在Mysql里计算两点之间的距离一般我们使用的sql如下:
6378.140 * 2 * ASIN(
SQRT(
POW(
SIN(
(
39.904989 * PI() / 180 - 表名.lat * PI() / 180
) / 2
),
2
) + COS(39.904989 * PI() / 180) * COS(表名.lat * PI() / 180) * POW(
SIN(
(
116.405285 * PI() / 180 - 表名.lng * PI() / 180
) / 2
),
2
)
)
) * 1000
这时需要声明一个函数接收计算出的距离,比如distance,所以现在的语句变成这样:
ROUND(
6378.140 * 2 * ASIN(
SQRT(
POW(
SIN(
(
39.904989 * PI() / 180 - 表名.lat * PI() / 180
) / 2
),
2
) + COS(39.904989 * PI() / 180) * COS(表名.lat * PI() / 180) * POW(
SIN(
(
116.405285 * PI() / 180 - 表名.lng * PI() / 180
) / 2
),
2
)
)
) * 1000
) AS distance
在这里需要重点说明一下ROUND这个函数,round函数用于数据的四舍五入,它有两种形式:
1、round(x,d) ,x指要处理的数,d是指保留几位小数
这里有个值得注意的地方是,d可以是负数,这时是指定小数点左边的d位整数位为0,同时小数位均为0;
2、round(x) ,其实就是round(x,0),也就是默认d为0;
所以现在我们只需要在这段sql的计算结果后面加上要定义取得小数位就行,语句如下
ROUND(
6378.140 * 2 * ASIN(
SQRT(
POW(
SIN(
(
39.904989 * PI() / 180 - 表名.lat * PI() / 180
) / 2
),
2
) + COS(39.904989 * PI() / 180) * COS(表名.lat * PI() / 180) * POW(
SIN(
(
116.405285 * PI() / 180 - 表名.lng * PI() / 180
) / 2
),
2
)
)
) * 1000,此处就是要定义的小数点位
) AS distance