2016-07-02 37 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_)混淆。