如何在给定的日期范围内总计设备总量

时间:2012-08-27 07:16:31

标签: php mysql

  

可能重复:
  Calculating total quantity of equipments for a date range

项目:我正在开展一个关于房间里使用的房间和设备的项目。该软件是关于调度房间内的设备。换句话说,它是一个预订软件,可以在所需的日期和时间范围内为所选设备预留单独的房间。我在MYsSQL数据库中有许多表与Php一起工作,但我会提到我的问题所在的表。我将与我的问题相关的表格是设备表(表A),时间表(表B)和在相关时间表中使用的设备(表C)。

表A:设备清单表

+------+----------+-----------+
| eqid | eqName   | available | 
+------+----------+-----------+
|    1 | book     |        90 |      
|    2 | pen      |        82 | 
|    3 | computer |        25 |
+------+----------+-----------+    

表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  | 
+------------+------------+------------+-----------+----------+--------+    

表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 |  
+--------+------------+------+-------------+

在表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

结果应该是:计划中使用了14本书,剩下76本书

因为:如果您查看scheduleIds和相关的eqIds,您将只看到与我的查询相关的1,2,6,7,9个scheduleIds(日期和eqId)。如果将表C中所有相关数量相加,则会得到错误的结果。换句话说,eqId(1-book)和1,2,6,7,9 scheduleIds的相关量分别为2,1,1,5,8。因此,如果你总结它们,你会得到17这是错误的。因为,1和9计划在开始和结束时间方面彼此不相交,并且6和7也不相互交叉。由于他们2保持孤独,可以分开计算。我们必须考虑1和9作为总和8因为8大于2.对于6和7是相同的,因为5大于1而被视为5 ...

所以大家好!我不确定如何在编程算法中总结/这个。有没有办法在SQL中做或者我必须一起使用PHP和Mysql?怎么样?

SQLFiddle Records

1 个答案:

答案 0 :(得分:0)

有不同的方法可以实现这一点 - 我将指出一些可以用于大多数数据库引擎的东西。

在mysql中,可以在单个查询中合并表。你需要的是这样的东西:

$eqid = 1;
$startDate = "2012-08-27";
$endDate = "2012-08-27";
$startTime = "08:30:00";
$endTime = "12:00:00";
$sql = "SELECT SUM(`amountInSch`) FROM `table_c`,`table_b` WHERE `eqid` = $eqid 
    AND `startDate` >= '$startDate' AND `startDate` <= '$endDate' AND `endDate` 
    <= '$endDate' AND `endDate` >= '$startDate' AND `startTime` >= '$startTime' 
    AND `startTime` <= '$endTime' AND `endTime` <= '$endTime' AND `endTime` >=
    '$startTime' AND `table_b`.`scheduleid` = `table_c`.`scheduleid`";
$r = mysql_query($sql);
$n = mysql_result($r,0,0);

诀窍是使用table_b`.`scheduleid` = `table_c`.`scheduleid(由于此处标记而缺少一些引号)来合并这两个表。