计算 MySQL 坐标并更新行

Calculate MySQL coordinate and update rows

我需要遍历 table 坐标(同一列中的经纬度)并将它们与给定值进行比较。如果距离小于 1 公里,则更新符合条件的行的另一列。

像这样:

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, '')

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

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 是连续的字符串,在 table...

大概,这就是你想要的:

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);

此外,一些注意事项:

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