2012-08-27 30 views
6

thể trùng lặp:
Calculating total quantity of equipments for a date rangeLàm thế nào để Summ tổng số thiết bị trong ngày đã cho khoảng

dự án: Tôi đang làm việc trên một dự án mà là về một số phòng và trang thiết bị sử dụng trong phòng. Phần mềm là về lịch trình các thiết bị trong phòng. Nói cách khác, nó là một phần mềm đặt chỗ dự trữ các thiết bị được lựa chọn trong các phòng riêng biệt cho các phạm vi ngày và thời gian cần thiết. Tôi có nhiều bảng trong cơ sở dữ liệu MYsSQL làm việc với Php nhưng tôi sẽ đề cập đến các bảng mà câu hỏi của tôi là về. Các bảng tôi sẽ liên hệ với câu hỏi của tôi là bảng thiết bị (Bảng A), bảng lịch biểu (Bảng B) và các thiết bị sử dụng trong lịch trình liên quan (Bảng C).

Bảng A: Danh mục thiết bị bảng

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

Trong bảng A; eqid đại diện cho id duy nhất của một thiết bị, eqName đại diện cho tên của một thiết bị, có sẵn đại diện cho tổng số thiết bị hiện có.

Bảng B: tiến độ bàn

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

Trong bảng B; scheduleid đại diện cho id duy nhất cho một lịch biểu, startDate và endDate là phạm vi ngày cho một lịch biểu, thời gian bắt đầu và phạm vi thời gian kết thúc cho một lịch biểu, văn phòng có nghĩa là nơi mà lịch biểu sẽ diễn ra. Hãy để tôi đưa ra một ví dụ ở đây. Lịch trình 1 có nghĩa là đặt phòng vào ngày 27 tháng 8 năm 2012, thứ Hai và từ 08:30 đến 10:00. Khi nó bắt đầu và kết thúc vào cùng ngày, đây chỉ là một ngày đặt phòng trong phòng1. Tuy nhiên, Scheduleid 3 có nghĩa là có một đặt phòng bắt đầu vào ngày 28 tháng 8 năm 2012, thứ ba và tiếp tục cho đến ngày 30 tháng 8 năm 2012, thứ Năm lúc 08: 30-12: 00 ... nói cách khác, nó kéo dài trong 3 ngày và hàng ngày từ 08:30 đến 12:00 ... Vì vậy, có một đặt phòng từ thứ ba đến thứ năm tại 08:30 đến 12:00 trong room2 ... Tôi hy vọng điều này là rõ ràng.

Bảng C: Thiết bị sử dụng trong kế hoạch liên quan

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

Trong bảng C: AutoID đại diện id tự động duy nhất được tạo bởi auto-increment, scheduleid đến từ Bảng B, eqid đến từ Bảng A, amountInSch đại diện như thế nào nhiều (số lượng) thiết bị sẽ sử dụng trong lịch trình liên quan. Tôi muốn đưa ra một ví dụ ở đây. Scheduleid 1 trong bảng C, có 3 hàng. Điều này có nghĩa là lịch biểu 1 có liên quan trong TAble B sẽ sử dụng 2 cuốn sách (eqid 1), 3 bút (eqid 2) và 1 máy tính (eqid 3) trong room1 ngày và giờ được chỉ định trong bảng B. Một ví dụ khác là lịch 3 trong Bảng C có liên quan 2 hàng. Nó có nghĩa là 1 bút (eqId 2) và 3 máy tính (eqId 3) sẽ được sử dụng trong phòng2 từ ngày 27 đến ngày 30 tháng 8 năm 2012 hàng ngày từ 08:30 đến 12:00.

Ở trên là giải thích và cung cấp một số thông tin về dự án. Các hàng trong bảng không phải là vĩnh viễn. Khi bạn thực hiện đặt phòng, sẽ có một hàng mới trong bảng B và nếu nó được chọn một thiết bị, sẽ có hàng mới trong bảng C ...

Các Câu hỏi:

tôi muốn để tính toán trái số lượng của một thiết bị cụ thể khi tôi cung cấp eqId, startDate, endDate, startTime và endTime ...

Một ví dụ:

eqId: 1 (book)

NgàyBắtđầu: 2012-08-27

NgàyKếtthúc: 2012-08-27

StartTime: 08:30:00

endTime: 12:00:00

Kết quả phải là: 14 cuốn sách được sử dụng trong sche dule và 76 sách còn lại có sẵn

Bởi vì: nếu bạn nhìn lịch biểuQuá trình và eqI liên quan, bạn sẽ chỉ thấy 1, 2, 6, 7, 9 scheduleIds liên quan đến truy vấn của tôi (ngày và eqId). Nếu bạn tính tổng số tiền có liên quan trong Bảng C, bạn sẽ nhận được kết quả sai. Nói cách khác, số tiền liên quan cho eqId (1 cuốn sách) và cho 1, 2, 6, 7, 9 scheduleIds là 2, 1, 1, 5, 8 tương ứng. Vì vậy, nếu bạn tổng hợp chúng, bạn sẽ nhận được 17 đó là sai. Bởi vì, lịch trình 1 và 9 không giao nhau với nhau về thời gian bắt đầu và kết thúc, và 6 và 7 không giao nhau với nhau. như là kết quả của họ 2 vẫn cô đơn và có thể được tính riêng. Chúng ta phải xem xét 1 và 9 là tổng 8 bởi vì 8 là lớn hơn 2. nó là giống nhau cho 6 và 7, được coi là 5 vì 5 là lớn hơn 1 ...

Vì vậy, folks! Tôi không chắc làm thế nào tôi có thể tổng hợp/điều này trong thuật toán lập trình. Có cách nào để làm trong SQL hoặc tôi có phải sử dụng PHP và Mysql với nhau? và làm thế nào?

SQLFiddle Records

+0

Không đưa ra ý tưởng (xin lỗi về điều đó) ... sẽ không dễ sử dụng cột 'DATETIME' thay vì cột' DATE' và 'TIME'? Và sau đó: Nếu một lịch trình là từ 9:00 đến 10:00 và kế tiếp là từ 10:00 đến 11:00 sẽ có thể sử dụng một thiết bị là cả hai lịch trình nếu họ không ở trong cùng một phòng? Bạn sẽ phải vận chuyển chúng từ X đến Y mà thường mất một thời gian. Vì vậy, có thể "không giao nhau" không đủ mạnh ở đây. – Jens

+0

@Jens có thể mang thiết bị từ phòng này sang phòng khác. Và sẽ có sự ngắt quãng giữa các lịch biểu. Nó đã được bắt đầu như thế này cho các lĩnh vực DATE và TIME do đó rất khó để thay đổi nó ngay bây giờ ... – deepnote

Trả lời

0

Có nhiều cách khác nhau để đạt được điều này - tôi sẽ chỉ cho bạn vào vật gì đó có thể được sử dụng với hầu hết các DB-động cơ.

Trong mysql, có thể hợp nhất các bảng trong một truy vấn đơn lẻ. Những gì bạn cần là một cái gì đó dọc theo dòng này:

$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); 

Bí quyết là để sử dụng (do một số dấu ngoặc kép đang thiếu để đánh dấu đây) table_b`.`scheduleid` = `table_c`.`scheduleid sáp nhập hai bảng.

+0

điều này không hoạt động. Khi tôi chạy truy vấn này như "SELECT SUM (' amountInSch') FROM 'Table3',' Table2' WHERE 'eqid' = 1 AND' startDate' <= '2012-08-27' AND 'endDate'> = '2012 -08-27 'VÀ 'thời gian bắt đầu' <= '08: 30: 00 'AND' endTime'> = '12: 00: 00' AND 'Bảng2'.'scheduleid' = ' Table3'.'scheduleid' " , kết quả của nó là NULL. và điều này có vẻ không hợp lý với tôi vì nó chỉ SUM trườngInInch. Bạn nên xem xét thời gian giao nhau ... – deepnote

+0

Dường như tôi vô tình lật logic - tất cả <= nên> = và ngược lại. Tôi đang chỉnh sửa câu trả lời ở trên để xuất hiện chính xác. – ipoga

+0

ngược lại một phần là ok bây giờ nhưng kết quả là sai. Nó sẽ là 14 không 16 ... – deepnote

Các vấn đề liên quan