【问题标题】:Append information of one MySQL table to another, based on intersections of timestamps in columns根据列中时间戳的交集将一个 MySQL 表的信息附加到另一个表
【发布时间】:2013-03-10 09:10:32
【问题描述】:

我正在使用 MySQL 来存储某些事件以及有关谁完成了此事件的信息 以及某个事件发生时的时间戳。我目前将这些信息存储在两个表中,“Cycles”和“Movement_Load”。

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

表格循环:

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

Table 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 )

要解决这个问题,请看我准备的fiddle:http://sqlfiddle.com/#!2/b1113

【问题讨论】:

    标签: mysql sql sqlite timestamp


    【解决方案1】:
    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 类似)

    【讨论】:

    • 谢谢 CL,你是最好的,它似乎工作!你能告诉我,这个查询是如何工作的吗?我怎样才能学会自己创建这样的查询?
    • 嗨 CL,这个问题还有一个后续问题:stackoverflow.com/questions/15406149/…
    猜你喜欢
    • 2017-02-25
    • 2020-02-18
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    • 2018-09-21
    • 1970-01-01
    • 2021-12-27
    • 2021-03-17
    相关资源
    最近更新 更多