我正在使用 MySQL 来存储某些事件以及有关谁完成此事件的信息 以及某个事件发生时的时间戳。我目前将这些信息存储在两个表中:“Cycles”和“Movement_Load”。
现在我想将“Movement_Load”中包含的信息附加到“Cycles”表中。此操作的好处是我将所有相关信息存储在一张表中。
表周期:
(1, '00:50:c2:63:10:1a', 1351508100, 1351508200, 'center', 0, 0);
工作台移动负载:
(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 )
要解决这个问题,请看我准备的fiddle:http://sqlfiddle.com/#!2/b1113
最佳答案
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)
(类似于加载
)
关于mysql - 根据列中时间戳的交集将一个 MySQL 表的信息附加到另一个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15320641/