如何比较表中的所有行并使用触发器提取数据

RAJ*_*MAR 5 mysql

我有两张表,一张表存储各种用户的 GPS 数据,另一张表存储基于 GPS 经纬度值和时间戳差异的用户空闲时间。

表T1内容:

id  uid  latitude   longitude    received_time          imno
435 25  13.041868   80.198868   2014-08-07 15:53:00     352944054874253 
436 25  13.041862   80.198868   2014-08-07 15:54:00     352944054874253 
437 25  13.041869   80.198868   2014-08-07 15:55:00     352944054874253 
438 25  13.041887   80.198871   2014-08-07 15:55:38     352944054874253 
439 25  13.041887   80.198871   2014-08-07 15:55:42     352944054874253 
440 25  13.041887   80.198871   2014-08-07 15:55:47     352944054874253 
441 25  13.041887   80.198871   2014-08-07 15:55:52     352944054874253 
442 25  13.041887   80.198871   2014-08-07 15:56:00     352944054874253 
Run Code Online (Sandbox Code Playgroud)

我必须比较具有相同纬度和经度值的行。

如果前一行的经纬度与下一行的经纬度相同,则计算时间戳差,直到下一行的经纬度值不相等。

例如,从 ID 438 到 442,纬度和经度值相同,所以我必须计算:

timediff = 442 received - 438 received time (in minutes)
Run Code Online (Sandbox Code Playgroud)

并将其存储在表 T2 中,如:

id  uid     latitude     longitude      idle_time               imno
1    25      13.041887   80.198871    2014-08-07 00:01:38    352944054874253 

start_time                        end_time
2014-08-07 15:55:38         2014-08-07 15:56:00 
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

小智 0

假设idt1 和 t2 都有 Primary_key 和自动增量列,我认为这就是您所需要的:

CREATE TRIGGER trig1
AFTER INSERT ON t1
FOR EACH ROW 
BEGIN
  IF @latitude = NEW.latitude AND @longitude = NEW.longitude THEN
     SET @end_time = NEW.received_time;
     SET @iddle_time = TIMEDIFF(NEW.received_time, @start_time);
     UPDATE t2 SET iddle_time = @iddle_time, end_time = @end_time
               WHERE id = @last_id_t2;
  ELSE

     INSERT INTO t2 VALUES (NULL, NEW.uid, NEW.latitude, NEW.longitude, 
                            NULL, NEW.imno, NEW.received_time, NEW.received_time);       
     SET @last_id_t2 = LAST_INSERT_ID();
     SET @latitude = NEW.latitude; SET @longitude = NEW.longitude;
     SET @iddle_time = NULL;
     SET @start_time = NEW.received_time; SET @end_time = NEW.received_time;
  END IF;
END;
Run Code Online (Sandbox Code Playgroud)

您可以在这里看到整个方案:http://sqlfiddle.com/#!2/a70ac /1