表A:设备清单表
eqid | eqName | available| 1 | book | 90 | 2 | pen | 82 | 3 | computer | 25 |@H_404_4@在表A中; eqid表示设备的唯一ID,eqName表示设备的名称,可用表示现有的可用设备总数.
表B:计划表
scheduleid | startDate | endDate | startTime | endTime | office | 1 | 2012-08-27 | 2012-08-27 | 08:30:00 | 10:00:00 | room1 | 2 | 2012-08-27 | 2012-08-27 | 09:30:00 | 11:00:00 | room3 | 3 | 2012-08-28 | 2012-08-30 | 08:30:00 | 12:00:00 | room2 | 4 | 2012-08-29 | 2012-08-31 | 11:30:00 | 14:00:00 | room1 | 5 | 2012-08-28 | 2012-08-28 | 10:30:00 | 14:00:00 | room3 | 6 | 2012-08-27 | 2012-08-30 | 08:30:00 | 10:00:00 | room4 | 7 | 2012-08-27 | 2012-08-27 | 10:30:00 | 12:00:00 | room4 | 8 | 2012-08-27 | 2012-08-30 | 08:30:00 | 11:00:00 | room6 | 9 | 2012-08-27 | 2012-08-27 | 10:30:00 | 12:00:00 | room5 |@H_404_4@在表B中; scheduleid表示计划的唯一ID,startDate和endDate是计划的日期范围,计划的startTime和endTime时间范围,office表示计划将在何处进行.让我举一个例子. Scheduleid 1表示2012年8月27日星期一有一个预订,时间是08:30到10:00.因为它在同一天开始和结束,这只是在room1预订一天.但是,Scheduleid 3意味着预订将于2012年8月28日星期二开始,并持续到2012年8月30日,星期四08:30-12:00 ……换句话说,它将持续3天,每天从08:30至12:00 …所以在2号房间的周二至周四08:30至12:00预订…我希望这一点很清楚.
表C:在相关时间表中使用的设备
Autoid | scheduleid | eqid | amountInSch| 1 | 1 | 1 | 2 | 2 | 1 | 2 | 3 | 3 | 1 | 3 | 1 | 4 | 2 | 1 | 1 | 5 | 2 | 2 | 1 | 6 | 2 | 3 | 2 | 7 | 3 | 2 | 1 | 8 | 3 | 3 | 3 | 9 | 4 | 2 | 1 | 10 | 4 | 3 | 1 | 11 | 5 | 1 | 1 | 12 | 6 | 1 | 1 | 13 | 6 | 3 | 2 | 14 | 6 | 2 | 4 | 15 | 7 | 1 | 5 | 16 | 7 | 2 | 6 | 17 | 8 | 2 | 1 | 18 | 9 | 1 | 8 | 19 | 9 | 2 | 5 | 20 | 9 | 3 | 6 |@H_404_4@在表C中:Autoid表示由自动增量生成的唯一自动id,scheduleid来自表B,eqid来自表A,amountInSch表示将在相关时间表中使用多少(数量)设备.我想在这里举个例子.表C中的Scheduleid 1有3行.这意味着在TAble B中相关的scheduleid 1将在表B中的room1指定日期和时间使用2本书(eqid 1),3本笔(eqid 2)和1台计算机(eqid 3).另一个例子是表C中的scheduleid 3与2行相关.这意味着1笔(eqId 2)和3台电脑(eqId 3)将于2012年8月27日至30日从08:30至12:00在room2使用.
以上是解释并提供有关该项目的一些信息.表行不是永久性的.当您进行预订时,表B中将有一个新行,如果选择了一个设备,表C中将有新行…
问题:
当我提供eqId,startDate,endDate,startTime和endTime时,我想计算特定设备的剩余量…
一个例子:
eqId:1(书)
startDate:2012-08-27
endDate:2012-08-27
startTime:08:30:00
结束时间:12:00:00
结果应该是:计划中使用的14本书和剩余的76本书
因为:如果您查看scheduleIds和相关的eqIds,您将只看到与我的查询相关的1,2,6,7,9个scheduleIds(日期和eqId).如果将表C中所有相关数量相加,则会得到错误的结果.换句话说,eqId(1-book)和1,9 scheduleIds的相关量分别为2,1,5,8.因此,如果你总结它们,你会得到17这是错误的.因为,1和9计划在开始和结束时间方面彼此不相交,并且6和7也不相互交叉.由于他们2保持孤独,可以分开计算.我们必须考虑1和9作为总和8因为8大于2.对于6和7是相同的,因为5大于1所以认为是5 …
大家好!我不确定如何在编程算法中求和/这个.有没有办法在sql中做或者我必须一起使用PHP和MysqL?如何?
干杯!
SELECT MAX(available) - IFNULL(SUM(amountInSch),0) FROM Table1 LEFT JOIN Table3 USING (eqid) LEFT JOIN Table2 USING (scheduleid) WHERE DATE(startDate) <= '2012-08-27' AND DATE(endDate) >= '2012-08-27' AND endTime > '08:30' AND startTime < '12:00' AND eqid = 1@H_404_4@这只是第一部分.接下来你必须找出可能的重叠;这对sql来说是不切实际的,所以我建议在PHP中这样做.
不幸的是,我会选择通用算法O(n ** 2),它是这样的:
>以时间为横轴创建时间轴(按每天划分)
>迭代每个日期/时间范围并标记其左右边缘的时间,以创建每个可能排列的时间段.
>使用细分,您可以垂直求和重叠,并获取每日最大值.希望有所帮助.