我正在构建一个“找到我最近的”脚本,我的客户已经向我提供了他们的位置列表。经过一些研究,我确定这样做的方法是对用户给出的地址/邮政编码进行地理编码,并使用Haversine公式来计算距离。
公式明智,我从this question得到了我想要的答案(对你们这些人而言)。所以我不会在这里重复冗长的查询/公式。
作为一个例子,我希望能够做到的是:
SELECT address, haversine(@myLat,@myLong,db_lat,db_long,'MILES') .....
这将更容易记住,以后更容易阅读,并且通过将功能复制到未来的项目中而不必重新学习/重新集成大公式,可以更加重复使用。此外,最后一个参数可以帮助我们以不同的单位返回距离。
是否可以创建用户MySQL函数/过程来执行此操作,我将如何进行此操作? (我认为这就是它们的用途,但我从来不需要使用它们!)
它会在长版本上提供任何速度差异(无论哪种方式)?
答案 0 :(得分:3)
是的,您可以为此创建一个存储的函数。像这样:
DELIMITER //
DROP FUNCTION IF EXISTS Haversine //
CREATE FUNCTION Haversine
( myLat FLOAT
, myLong FLOAT
, db_lat FLOAT
, db_long FLOAT
, unit VARCHAR(20)
)
RETURNS FLOAT
DETERMINISTIC
BEGIN
DECLARE haver FLOAT ;
IF unit = 'MILES' --- calculations
SET haver = ... --- calculations
RETURN haver ;
END //
DELIMITER ;
我认为它没有提供任何速度增益,但它对你提到的所有其他原因都有好处:可读性,可重用性,易于维护(想象你在2年后发现错误,你必须编辑代码(几百个地方)。