2016-07-02 38 views
2

我有以下情况,由于我是mysql新手,没有人指导我,我会问你。计算MySQL coordonate并更新行

我需要通过坐标(lat,long在同一列中)的表格进行循环,并将它们与给定值进行比较。如果距离低于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, '') 

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

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是一个字符串成一排,在表...

+0

UPDATE my_table SET column2 = x WHERE Calcu .... <1 – Strawberry

+0

或者你的问题是关于如何突破拉特。和长。从他们的共同专栏? –

+0

我认为Straberry为我提供了答案。我会回来更新asap – patri

回答

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_)混淆。