mysql - 根据列中时间戳的交集将一个 MySQL 表的信息附加到另一个表

标签 mysql sql sqlite timestamp

我正在使用 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/

相关文章:

mysql - 在 MySql 中删除除一个表之外的所有表

java - JDBC插入查询不更新mysql数据库

sql - MySQL Count 基于多列的值

mysql - 我从/db/mysql56删除文件后MAMP要求安装wordpress

MySQL 过程仅在不存在时插入

Mysql函数从过程调用返回行数

java - SQL子查询没有返回任何值,但junit测试仍然通过

android - 当 UPDATE 发生时,SQL 时间戳不会改变

android - 它不会写超过 3 个表

ios - SQLite 或 coredata 或其他