2012-08-27 70 views
6

可能重複:
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代表設備的名稱,available代表現有的可用設備總數。

表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時間範圍,辦公室表示計劃的執行時間。讓我舉一個例子。 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 ...因此,週二至週四08:30至12:00在房間2預訂...我希望這是明確的。

表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中的設備:自動識別表示由自動遞增生成獨特的自動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行相關。這意味着每天從08:30至12:00每天將在2012年8月27日至30日的2號房間使用1支(eqId 2)和3套電腦(eqId 3)。

以上是對該項目的解釋和一些信息。表格行不是永久的。當你預約,將有表B中的新行,如果它被選中的設備,就會出現在表C中新的行...

問題:

我想計算左當我提供eqId,startDate,endDate,startTime和endTime時特定設備的數量......

一個例子:

eqId:1(書)

開始日期:2012年8月27日

結束日期:2012年8月27日

開始時間:8時30分00秒

結束時間:12:00:00

結果應該是:在血清膽鹼酯酶用14本書由於:如果你看scheduleIds和相關的eqIds,你只會看到與我的查詢(日期和eqId)相關的1,2,6,7,9個scheduleIds。如果你總結表C中的所有相關數量,你將得到錯誤的結果。換句話說,eqId(1-book)和1,2,6,7,9時間表的相關數量分別是2,1,1,5,8。所以如果你總結他們,你會得到17這是錯誤的。因爲1和9時間表在開始和結束時間方面並不相互交叉,6和7也不相互交叉。由於他們2留下孤獨,可以分開計數。因爲8大於2,所以我們必須考慮1和9的總和8.因爲8和6都是相同的,所以5被認爲是5因爲大於1 ...

所以人們!我不確定我如何在編程算法中總結這一點。有沒有辦法在SQL中做或我必須一起使用PHP和Mysql?如何?

SQLFiddle Records

+0

沒有提出一個想法(對此感到遺憾)......使用DATETIME列而不是DATE和TIME列不會更容易嗎?然後:如果一個時間表是從9:00到10:00,而另一個是從10:00到11:00,那麼如果一個設備不在同一個房間,那麼可以使用一個設備是兩個時間表?您將不得不將它們從X傳輸到Y,這通常需要一些時間。所以也許「不相交」在這裏不夠強大。 – Jens

+0

@Jens可以將設備從一個房間搬到另一個房間。時間表之間會有中斷。這是開始像這樣的日期和時間字段,所以現在很難改變它... – deepnote

回答

0

有實現這一目標的不同方式 - 我會點你的東西,可以與大多數DB-引擎使用。

在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(一些報價缺失由於此標記)合併兩個表。

+0

這是行不通的。當我運行這個查詢,如「SELECT SUM('amountInSch')FROM'Table3','Table2' WHERE'eqid' = 1 AND'startDate' <='2012-08-27'AND'endDate'> ='2012 -08-27'AND'startTime' <= '08:30:00'AND'endTime'> = '12:00:00'AND'Table2'.'scheduleid' = 'Table3'.'scheduleid'「 ,其結果是NULL。這對我來說似乎不合邏輯,因爲它只是SUM amountInSch字段。你應該考慮時間相交... – deepnote

+0

似乎我意外地翻轉了邏輯 - 所有的<=應該> =,反之亦然。我正在編輯我的答案上面顯示正確。 – ipoga

+0

反之亦然現在可以,但結果是錯誤的。它應該是14而不是16 ... – deepnote