2012-08-27 15 views
6

Eventuali duplicati:
Calculating total quantity of equipments for a date rangeCome summ quantità totale di attrezzature in certa data gamme

Progetto: Sto lavorando su un progetto che è di circa alcune stanze e attrezzature che utilizzano nel camere. Il software riguarda la pianificazione delle attrezzature nelle stanze. In altre parole, è un software di prenotazione che riserva le apparecchiature selezionate in stanze separate per le date e gli intervalli di tempo necessari. Ho molte tabelle nel database MYsSQL che funziona con Php, ma menzionerò le tabelle di cui la mia domanda riguarda. Le tabelle che farò riferimento alle mie domande sono la tabella delle attrezzature (Tabella A), la tabella degli orari (Tabella B) e le apparecchiature che utilizzano il programma relativo (Tabella C).

Tabella A: tavolo lista degli equipaggiamenti

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

In tabella A; eqid rappresenta l'ID univoco di un'apparecchiatura, eqName rappresenta il nome di un'apparecchiatura, disponibile rappresenta le attrezzature disponibili totali esistenti.

Tabella B: tabella di pianificazione

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

In tabella B; scheduleid rappresenta l'ID univoco per una pianificazione, startDate e endDate sono intervalli di date per una pianificazione, ora di inizio e intervallo di tempo di endTime per una pianificazione, ufficio indica che la pianificazione avrà luogo. Lasciatemi fare un esempio qui. Scheduleid 1 significa che c'è una prenotazione il 27 agosto 2012, lunedì ed è dalle 08.30 alle 10:00. All'inizio e alla fine dello stesso giorno, questo è solo un giorno di prenotazione in camera1. Tuttavia, Scheduleid 3 significa che c'è una prenotazione inizia il 28 agosto 2012, martedì e prosegue fino al 30 agosto 2012, giovedì alle 08: 30-12: 00 ... in altre parole, dura 3 giorni e ogni giorno a partire da Dalle 08:30 alle 12:00 ... Quindi c'è una prenotazione dal martedì al giovedì alle 08:30 alle 12:00 nella stanza2 ... Spero che questo sia chiaro.

Tabella C: dispositivi che utilizzano nel relativo programma

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

In tabella C: AutoID rappresenta unica id automatico generato dal incremento automatico, scheduleid proviene dalla Tabella B, eqid proviene dalla Tabella A, amountInSch rappresenta come molte (quantità) attrezzature useranno nel programma relativo. Voglio fare un esempio qui. Scheduleid 1 nella tabella C, ci sono 3 righe. Ciò significa che scheduleid 1 correlato in TAble B utilizzerà 2 libri (eqid 1), 3 penne (eqid 2) e 1 computer (eqid 3) nella stanza 1 date e orari specificati nella tabella B. Un altro esempio è che scheduleid 3 nella tabella C è correlato a 2 righe. Significa che 1 penna (eqId 2) e 3 computer (eqId 3) verranno utilizzati nella sala 2 dal 27 al 30 agosto 2012 tutti i giorni dalle 08:30 alle 12:00.

Quanto sopra è la spiegazione e fornire alcune informazioni sul progetto. Le righe della tabella non sono permanenti. Quando si effettua una prenotazione, ci sarà una nuova riga nella tabella B e se è stato selezionato un impianto, ci saranno nuove righe nella tabella C ...

la domanda:

voglio calcolare sinistra quantità di un'attrezzatura specifica quando fornisco eqId, startDate, endDate, startTime e endTime ...

Un esempio:

eqId: 1 (libro)

startDate: 2012-08-27

endDate: 2012-08-27

startTime: 08:30:00

endTime: 12:00:00

risultato dovrebbe essere: 14 libri usati a sche dule e 76 lasciati libri disponibili

Perché: se si guardano gli ID di pianificazione e gli eqId correlati, verranno visualizzati solo 1, 2, 6, 7, 9 orari di programmazione relativi alla mia query (date ed eqId). Se somma la somma di tutti i correlati nella Tabella C, otterrai il risultato sbagliato. In altre parole, gli importi relativi per eqId (1-book) e per 1, 2, 6, 7, 9 scheduleIds sono 2, 1, 1, 5, 8 rispettivamente. Quindi se li sommi otterrai 17 che è sbagliato. Perché il programma 1 e 9 non si intersecano tra loro in termini di ore di inizio e di fine, e 6 e 7 non si intersecano tra loro. come risultato di loro 2 rimane solo e può essere contato separatamente. Dobbiamo considerare 1 e 9 come sommato 8 perché 8 è più grande di 2. è lo stesso per 6 e 7, considerato come 5 perché 5 è più grande di 1 ...

Così gente! Non sono sicuro di come posso sommare/questo nell'algoritmo di programmazione. C'è un modo per farlo in SQL o devo usare PHP e Mysql insieme? e come?

SQLFiddle Records

+0

Senza un'idea (scusate per questo) ... non sarebbe più facile usare le colonne 'DATETIME' invece delle colonne' DATE' e 'TIME'? E poi: se un programma è dalle 9:00 alle 10:00 e il successivo è dalle 10:00 alle 11:00, sarebbe possibile utilizzare un equipaggiamento entrambi gli orari se non sono nella stessa stanza? Dovresti trasportarli da X a Y, che di solito richiede del tempo. Quindi forse "non si interseca" non è abbastanza forte qui. – Jens

+0

@Jens è possibile trasportare le attrezzature da una stanza all'altra. E ci saranno pause tra gli orari. È stato avviato in questo modo per i campi DATE e TIME, quindi è difficile modificarlo ora ... – deepnote

risposta

0

Ci sono diversi modi per raggiungere questo - voglio puntare a qualcosa che può essere usato con la maggior parte DB-motori.

In mysql, è possibile unire tabelle in una singola query. Quello che vi serve è qualcosa lungo la linea di questo:

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

Il trucco è quello di utilizzare il (a causa alcune citazioni mancano di markup qui) table_b`.`scheduleid` = `table_c`.`scheduleid per unire le due tabelle.

+0

questo non funziona. Quando eseguo questa query come "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' " , il suo risultato è NULL. e questo non mi sembra logico in quanto si tratta solo del campo SINTmInsch. Dovresti considerare il tempo che si interseca ... – deepnote

+0

Sembra che abbia invertito accidentalmente la logica - tutto il <= dovrebbe essere> = e viceversa. Sto modificando la mia risposta sopra per apparire corretta. – ipoga

+0

viceversa la parte è ok ora ma il risultato è sbagliato. Dovrebbe essere 14 non 16 ... – deepnote

Problemi correlati