我在MySQL中有两个表。在每个表中,保存了具有其MAC地址和状态区域信息的设备。
这些状态确实在某些时间戳记(startTime,endTime)及其持续时间(endTime-startTime)处开始和结束,并且是由某些ID引起的。
现在,我想查找某些事件“移动”和“负载”之间的重叠部分,这些重叠部分以天为单位,如下所示:
sum of time, when movement took place (value in the fiddle: 421) sum of time, when load took place (value in the fiddle: 520) sum of time, when movement and load took place (value in the fiddle: 391)
查询结果应如下所示:
ID DATE ALL_MOVEMENT ALL_LOAD LOAD_MOVEMENT 00:50:c2:63:10:1a October, 29 2012 00:00:00+0000 421 520 391 00:50:c2:63:10:1a February, 22 2013 00:00:00+0000 421 520 391 00:50:c2:63:10:1b February, 22 2013 00:00:00+0000 181 220 181
我在这里准备了一个小提琴:http ://sqlfiddle.com/#!2/ c210c
更新:在这里可以看到一个小提琴,它以不同的表结构提供了我想要的东西:
http://sqlfiddle.com/#!2/31b94/1
我不太了解数据集与结果集之间的关系,但在我看来,您或多或少需要这样的东西…
SELECT m.id , DATE(FROM_UNIXTIME(m.starttime))Date,SUM(m.duration) all_movement , SUM(l.duration) all_load FROM move_table m JOIN load_table l ON l.id = m.id AND l.endtime > m.starttime AND l.starttime < m.endtime GROUP BY m.id , DATE(FROM_UNIXTIME(m.starttime)); +-------------------+------------+--------------+----------+ | id | Date | all_movement | all_load | +-------------------+------------+--------------+----------+ | 00:50:c2:63:10:1a | 2012-10-29 | 391 | 520 | | 00:50:c2:63:10:1a | 2013-02-22 | 391 | 520 | | 00:50:c2:63:10:1b | 2013-02-22 | 181 | 220 | +-------------------+------------+--------------+----------+
顺便说一句,duration在这种情况下似乎是多余的,因为(例如)SUM(m.endtime-m.starttime)将为您提供相同的结果。
duration