2013-03-10 35 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

相關問題