计算MySQL坐标并更新行

时间:2016-07-02 10:27:30

标签: mysql sql loops coordinates distance

我需要循环一个带坐标的表(lat,long在同一列中)并将它们与给定值进行比较。如果距离小于1 km,则更新符合条件的行的另一列。

这样的事情:

Foreach row in Table
if CalculateDistance(lat1,long1,lat2,long2) < 1
Update row.Column2

我在这里找到了一个计算公式:https://gist.github.com/Usse/4086343

此刻我正试图测试这个公式。

谢谢

编辑1:

所以我创建了这个程序但是我被卡住了。

我创建了一个分割字符串函数:

CREATE DEFINER=`root`@`localhost` FUNCTION `strSplit`(x varchar(255), delim varchar(12), pos int) RETURNS varchar(255) CHARSET utf8
return replace(substring(substring_index(x, delim, pos), length(substring_index(x, delim, pos - 1)) + 1), delim, '')

我更新表的存储过程是这样的:

CREATE DEFINER=`root`@`localhost` PROCEDURE `turn_camera_on`(coordonates varchar(50))
BEGIN

DECLARE lat1 varchar(50);
DECLARE long1 varchar(50);

SET lat1 = strSplit(coordonates, ',', 1);
SET long1 = strSplit(coordonates, ',', 2);

UPDATE deviceinfo
SET CameraOn = 1
where CalculateDistance(lat1,long1,**lat2,long2**) < 1;

END

问题是lat2和long2是一行中的一个字符串,在表格中......

1 个答案:

答案 0 :(得分:2)

据推测,这可以满足您的需求:

DECLARE v_lat1 varchar(50);
DECLARE v_long1 varchar(50);

SET lat1 = strSplit(v_coordinates, ',', 1);
SET long1 = strSplit(v_coordinates, ',', 2);
UPDATE deviceinfo di
    SET CameraOn = 1
WHERE CalculateDistance(v_lat1, v_long1, strSplit(di.coordinates, ',', 1), strSplit(di.coordinates, ',', 2)) < 1;

然而,在MySQL中定义自己的分割函数似乎是多余的。你可以写:

UPDATE deviceinfo di
    SET CameraOn = 1
WHERE CalculateDistance(substring_index(v_coordinates, ',', 1),
                        substring_index(v_coordinates, ',', -1),
                        substring_index(di.coordinates, ',', 1),
                        substring_index(di.coordinates, ',', -1);

另外,还有一些注意事项:

  • 始终定义表别名(上述查询中的di)。
  • 始终限定列名称(上述查询中的di.)。
  • 前缀变量和参数名称,以便它们不会与上述查询中的列(v_)混淆。