附近的人计算方法-----使用mysql脚本计算方法,-----mysql
附近的人计算方法
drop function if exists getDistance;
DELIMITER $$
CREATE DEFINER=`root`@`localhost` FUNCTION `getDistance`(
lon1 float(10,7)
,lat1 float(10,7)
,lon2 float(10,7)
,lat2 float(10,7)
) RETURNS double
begin
declare d double;
declare radius int;
set radius = 6378140; #假设地球为正球形,直径为6378140米
set d = (2*ATAN2(SQRT(SIN((lat1-lat2)*PI()/180/2)
*SIN((lat1-lat2)*PI()/180/2)+
COS(lat2*PI()/180)*COS(lat1*PI()/180)
*SIN((lon1-lon2)*PI()/180/2)
*SIN((lon1-lon2)*PI()/180/2)),
SQRT(1-SIN((lat1-lat2)*PI()/180/2)
*SIN((lat1-lat2)*PI()/180/2)
+COS(lat2*PI()/180)*COS(lat1*PI()/180)
*SIN((lon1-lon2)*PI()/180/2)
*SIN((lon1-lon2)*PI()/180/2))))*radius;
return d;
end
$$
DELIMITER ;
select getDistance(116.3899,39.91578,116.3904,39.91576);方法挺多的,很多是采用排序直接对等连接,这样对于主键聚集索引比较快的。
----
我提供的不是排序对等 方式,而是大范围连接检索最小距离的方式。
SELECT
A.FID,A.Fnum,MIN(A.Fid-B.Fid) as 差值
FROM test.cte A
INNER JOIN test.cte B on(A.FID>B.FID)
GROUP BY A.FID,A.Fnum
ORDER BY A.Fid Desc
---
执行结果:
FID Fnum 差值
-------------------------
'9323', '10', '14'
'9309', '10', '1'
'9308', '10', '47'
'9261', '10', '31'
'9230', '10', '23'
'9207', '10', '16'
'9191', '10', '26'
'9165', '10', '14'
第一种方法:
在命令行下(未连接数据库),输入 mysql -h localhost -u root -p123456 < F:\hello world\niuzi.sql (注意路径不用加引号的!!) 回车即可.
第二种方法:
在命令行下(已连接数据库,此时的提示符为 mysql> ),输入 source F:\hello world\niuzi.sql (注意路径不用加引号的) 或者 \. F:\hello world\niuzi.sql (注意路径不用加引号的) 回车即可
本站文章为和通数据库网友分享或者投稿,欢迎任何形式的转载,但请务必注明出处.
同时文章内容如有侵犯了您的权益,请联系QQ:970679559,我们会在尽快处理。