我发现了一个程序,它几乎完全符合我在本页中所寻找的内容:
http://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL
我对它进行了一些修改,以便实际使用我的数据库,但每次我创建函数时,它都会抛出一个错误。我假设我不能在MySQL 5.0中创建一个过程,而是必须创建一个函数。我只是需要一点帮助。我对为MySQL创建过程非常陌生。
DELIMITER $$
DROP FUNCTION IF EXISTS `GEODIST` $$
CREATE FUNCTION `GEODIST`( mylat float, mylong float, dist int )
BEGIN
DECLARE lon1 float;
DECLARE lon2 float;
DECLARE lat1 float;
DECLARE lat2 float;
set lon1 = mylon - dist/abs(cos(radians(mylat))*69);
set lon2 = mylon + dist/abs(cos(radians(mylat))*69);
set lat1 = mylat - (dist/69);
set lat2 = mylat + (dist/69);
SELECT destination.*,3956 * 2 * ASIN(SQRT( POWER(SIN((orig.lat -dest.lat) * pi()/180 / 2), 2) +COS(orig.lat * pi()/180) * COS(dest.lat * pi()/180) *POWER(SIN((orig.lon -dest.lon) * pi()/180 / 2), 2) )) as distance FROM users destination, users origin WHERE origin.id=userid
and destination.longitude between lon1 and lon2 and destination.latitude between lat1 and lat2
having distance < dist ORDER BY Distance limit 10;
END $$
当我运行此代码时,会抛出一个错误:
错误SQL查询:文档
创建函数GEODIST
(
mylat浮点、mylong浮点、dist INT)开始声明lon1浮点;
宣布lon2浮动;
宣布lat1浮动;
宣布lat2浮动;
设置lon1=mylon-dist/ABS(COS(弧度(mylat))*69;
设置lon2=迈伦距离/绝对值(COS(弧度(迈拉))*69);
设置lat1=mylat-(dist/69);
设置lat2=mylat(dist/69);
选择目的地。*,3956*2*ASIN(SQRT(功率(SIN((orig.lat-dest.lat)*PI()/180/2),2)COS(orig.lat*PI()/180)*COS(dest.lat*PI()/180)*功率(SIN((orig.lon-dest.lon)*PI()/180/2))作为用户到目的地的距离,用户从哪里出发。id=用户id和目的地。lon1和lon2与目的地之间的经度。lat1和lat2之间有距离的纬度
END$$MySQL:Documentation
靠近'BEGIN DECLARE lon1浮点数;DECLARE lon2浮点数;第2行的DECLARE lat1浮点数'
编辑:我在下面被建议将此更改为我有的程序,但它抛出错误:
在第3行的“”附近
如果不需要从存储例程返回值,则需要创建一个过程,只需将create FUNCTION
更改为create procedure
。
否则,需要添加RetURNS
子句来指定结果数据类型,并在函数体中添加RetURN
子句来设置结果值。
创建过程和创建函数语法。