【发布时间】:2013-12-19 08:10:00
【问题描述】:
我发现一个程序几乎完全符合我在此页面上寻找的内容:
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 FLOAT, mylong FLOAT, dist INT ) BEGIN DECLARE lon1 FLOAT;
声明 lon2 浮点数;
声明 lat1 浮点数;
声明 lat2 浮点数;
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);
选择目的地。 * , 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 距离用户目的地,用户 origin WHERE origin.id = userid AND destination.longitude BETWEEN lon1 AND lon2 AND destination.latitude BETWEEN lat1 AND lat2 HAVING distance
END $$ MySQL 说:文档
1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册以了解正确的语法使用
在“开始”附近 声明 lon1 浮点数; 声明 lon2 浮点数; 在第 2 行声明 lat1 float'
编辑:下面建议我将其更改为我拥有的 PROCEDURE,但它会引发错误:
1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册以了解正确的语法使用
第3行的''附近
【问题讨论】:
标签: mysql stored-procedures geospatial spatial procedure