计算MySQL坐标并更新行
我需要遍历一个带有坐标(lat,long在同一列中)的表,并将它们与给定值进行比较。如果距离小于1 km,则更新与该条件相关的行的另一列 大概是这样的:计算MySQL坐标并更新行,mysql,sql,loops,coordinates,distance,Mysql,Sql,Loops,Coordinates,Distance,我需要遍历一个带有坐标(lat,long在同一列中)的表,并将它们与给定值进行比较。如果距离小于1 km,则更新与该条件相关的行的另一列 大概是这样的: Foreach row in Table if CalculateDistance(lat1,long1,lat2,long2) < 1 Update row.Column2 我更新表的存储过程如下: CREATE DEFINER=`root`@`localhost` PROCEDURE `turn_camera_on`(coordon
Foreach row in Table
if CalculateDistance(lat1,long1,lat2,long2) < 1
Update row.Column2
我更新表的存储过程如下:
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
CREATE DEFINER=`root`@`localhost`PROCEDURE`打开摄像头`(coordonates varchar(50))
开始
声明lat1 varchar(50);
声明long1 varchar(50);
设置lat1=strSplit(坐标,',',1);
SET long1=strSplit(coordonates,',',2);
更新设备信息
设置CameraOn=1
其中计算距离(lat1,long1,**lat2,long2**)<1;
结束
问题在于lat2和long2是一行中的字符串,在表中…大概这就是您想要的:
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;
此外,请注意:
- 始终定义表别名(上述查询中的
)di
- 始终限定列名(上述查询中的
)di.
- 为变量和参数名添加前缀,以便它们不会与上述查询中的列(
)混淆v
strSplit
函数;就像您使用coordonates
获得lat1和long1一样。
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;
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);