Итак, у меня есть 2 таблицы, communication
и movement
.
communication
имеет столбцы fromID
, timestamp
с идентификатором вызывающего абонента и временем совершения звонка. Затем у меня есть другая таблица movement
, в которой есть ID
,timestamp
,x
,y
, в которой есть идентификатор человека, его местоположение (x,y)
и время, когда они находятся в этом месте.
Я хочу написать запрос, который выглядит примерно так:
For every single row of communication(R)
SELECT * FROM movement m
WHERE m.ID = R.fromID && m.timestamp <= R.timestamp
ORDER BY timestamp
По сути, это поиск ближайшего movement timestamp
для заданного communication timestamp
. После этого, в конце концов, я хочу найти местоположение (x,y)
звонка на основе данных movement
.
Как бы я это сделал? Я знаю, что существует подход, основанный на наборах, но я не хочу делать это таким образом. Я посмотрел на cursors
, но у меня такое ощущение, что производительность на нем ужасна.
Так есть ли способ сделать это с помощью цикла? По сути, я хочу перебрать каждую строку communication
и получить результат.
Я пробовал что-то вроде этого:
DELMITER $$
CREATE PROCEDURE findClosestTimestamp()
BEGIN
DECLARE commRowCount DEFAULT 0;
DECLARE i DEFAULT 0;
DECLARE ctimestamp DEFAULT 0;
SELECT COUNT(*) FROM communication INTO commRowCount;
SET i = 0;
WHILE i < commRowCount DO
SELECT timestamp INTO ctimestamp FROM communication c
SELECT * FROM movement m
WHERE m.vID = c.fromID && m.timestamp <= R.timestamp
END$$
DELIMITER ;
Но я знаю, что это совершенно неправильно.
Единственный способ сделать это курсоры? Я просто не могу найти пример этого нигде в Интернете, и я совершенно не знаком с процедурами в SQL.
Любое руководство будет принято с благодарностью, спасибо!!
movement
строка, в которойtimestamp
ближе всего к строкеcommunication
. - person ocean800   schedule 11.06.2015cursors
? К сожалению, да, я не могу использовать подход, основанный на наборах. - person ocean800   schedule 11.06.2015