2013-03-10 62 views
2

我正在使用MySQL存储某些事件,其中包含有关谁已完成此事件的信息 以及某个事件发生时的时间戳。我现在将这些信息存储在两张表格中,“Cycles”和“Movement_Load”。基于列中的时间戳的交集,将一个MySQL表的信息追加到另一个列表中

现在我想将“Movement_Load”中包含的信息附加到表格“Cycles”中。这个操作的好处是我将所有相关信息存储在一张表中。

表循环:

(1, '00:50:c2:63:10:1a', 1351508100, 1351508200, 'center', 0, 0); 

表Movement_Load:

(1, 'move_sensor1', 1351508090,  'movement start'), 
(2, 'move_sensor1', 1351508120,  'movement end'), -- 20 not 30, because it starts at 1351508100 
(3, 'move_sensor1', 1351508140,  'movement start'), 
(4, 'move_sensor1', 1351508170,  'movement end'), -- 30 
(5, 'move_sensor1', 1351508190,  'movement start'), 
(6, 'move_sensor1', 1351508210,  'movement end'), -- 10 not 20, because it ends at 1351508200 
                 -- movement sum is 60 
(7,'load_sensor1', 1351508130,  'load start'), 
(8,'load_sensor1', 1351508180,  'load end'), -- 50 
(9,'load_sensor1', 1351508185,  'load start'), 
(10,'load_sensor1', 1351508220,  'load end') -- 15 not 35, because it ends at 1351508200 
                -- load sum is 65 

结果应该是这样的,运动(60)和负载(65)现在存储在该表中:

(1, '00:50:c2:63:10:1a', 1351508100, 1351508200, 'center', 60, 65) 

要解决此问题,请参阅我准备好的小提琴:http://sqlfiddle.com/#!2/b1113

回答

2
UPDATE Cycles 
SET movement_time = 
    (SELECT IFNULL(SUM(CASE event 
         WHEN 'movement start' THEN -timestamp 
         WHEN 'movement end' THEN timestamp 
         ELSE      0 
         END), 0) 
      + CASE (SELECT event 
        FROM Movement_load 
        WHERE timestamp BETWEEN Cycles.startTimestamp 
             AND Cycles.endTimestamp 
         AND event LIKE 'movement %' 
        ORDER BY timestamp 
        LIMIT 1) 
       WHEN 'movement end' THEN -Cycles.startTimestamp 
       ELSE      0 
       END 
      + CASE (SELECT event 
        FROM Movement_load 
        WHERE timestamp BETWEEN Cycles.startTimestamp 
             AND Cycles.endTimestamp 
         AND event LIKE 'movement %' 
        ORDER BY timestamp DESC 
        LIMIT 1) 
       WHEN 'movement start' THEN Cycles.endTimestamp 
       ELSE      0 
       END 
    FROM Movement_Load 
    WHERE timestamp BETWEEN Cycles.startTimestamp 
         AND Cycles.endTimestamp) 

(类似于为load

+0

感谢CL,你是最好的,它似乎工作!你能告诉我,这个查询是如何工作的吗?我如何学会自己创建这样的查询? – 2013-03-10 12:36:21

+0

嘿CL,这个有一个后续问题:http://stackoverflow.com/questions/15406149/mysql-overlaps-of-two-tables-in-timestamps – 2013-03-14 20:12:43

相关问题