2016-07-02 3 views
2

У меня есть следующий сценарий, и поскольку я новичок в mysql, и никто не ведёт меня, я спрошу вас.Вычислить MySQL координировать и обновлять строки

Мне нужно пройти через таблицу с координатами (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

Я думаю, что Страйни мне ответит. Я вернусь с обновлениями как можно скорее – 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_) в вышеуказанных запросах.