我有一个查询,用于计算给定lat和lng以及POINT
s的距离。
现在我想让它成为一个功能:
DELIMITER $$
CREATE FUNCTION CalculateDistance(geobreite double, geolaenge double, umkreis int) RETURNS INT READS SQL DATA
BEGIN
SET @ibk_laenge = geobreite;
SET @ibk_breite = geolaenge;
SET @umkreis = umkreis;
SET @breite_nord = @ibk_breite + (@umkreis / 111);
SET @breite_sued = @ibk_breite - (@umkreis / 111);
SET @laenge_west = @ibk_laenge - (@umkreis / ABS(COS(RADIANS(@ibk_breite))) * 111);
SET @laenge_ost = @ibk_laenge + (@umkreis / ABS(COS(RADIANS(@ibk_breite))) * 111);
SET @mp = CONCAT('MULTIPOINT(', @breite_sued , ' ', @laenge_west, ', ', @breite_nord, ' ', @laenge_ost, ')');
SET @quadrat = ENVELOPE(GEOMFROMTEXT(@mp));
RETURN
SELECT (
FLOOR(
SQRT(
POW((@ibk_breite - sub.breite) * 111, 2) +
POW((@ibk_laenge - sub.laenge) * 111 * ABS(COS(RADIANS(@ibk_breite))),2)
)
)
) AS distanz
FROM
(
SELECT Y(location) AS laenge, X(location) AS breite FROM meetings WHERE MBRCONTAINS(@quadrat, location)
)
AS sub;
END; $$
DELIMITER ;
但它引发了一个错误:
1064 - 您的SQL语法出错;检查>对应于您的MySQL服务器版本的手册,以获得正确的语法,以便在附近使用 '选择(
FLOOR(
SQRT(
战俘((@ i'在第18行
如果我用phpmyadmin执行查询,它可以正常运行。
答案 0 :(得分:1)
要修复语法错误,请尝试将SELECT查询包装到括号中,例如 -
RETURN (SELECT column1 FROM table WHERE id = 1);
下一个问题:函数必须返回一个标量值,如果SELECT查询返回一些记录,则会出错。
此外,您可以使用SELECT ... INTO查询将值写入变量,并在返回之后:
SELECT FLOOR(SQRT(...)) INTO @ret FROM ...;
RETURN @ret;