2012-08-27 6 views
6

Mögliche Duplizieren:
Calculating total quantity of equipments for a date rangeWie Gesamtmenge an Ausrüstungen in bestimmten Zeitpunkt Summ reicht

Projekt: ich an einem Projekt arbeite, das ist über einige Zimmer und Einrichtungen in der Verwendung Räume. Bei der Software geht es darum, die Geräte in den Räumen zu planen. Mit anderen Worten, es ist eine Reservierungssoftware, die ausgewählte Geräte in separaten Räumen für benötigte Daten und Zeiträume reserviert. Ich habe viele Tabellen in MYsSQL-Datenbank, die mit PHP arbeiten, aber ich werde die Tabellen erwähnen, um die meine Frage geht. Die Tabellen, auf die ich meine Fragen beziehen werde, sind die Gerätetabelle (Tabelle A), die Planungstabelle (Tabelle B) und die Geräte, die in dem zugehörigen Plan (Tabelle C) verwendet werden.

Tabelle A: Ausrüstungsliste Tabelle

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

In Tabelle A; eqid steht für die eindeutige ID eines Geräts, eqName steht für den Namen eines Geräts, steht für verfügbare verfügbare Geräte.

Tabelle B: Plantabelle

+------------+------------+------------+-----------+----------+--------+ 
| 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 Tabelle B; scheduleid stellt eine eindeutige ID für einen Zeitplan dar, startDate und endDate sind der Datumsbereich für einen Zeitplan, startTime und endTime-Zeitbereich für einen Zeitplan, office bedeutet, wo der Zeitplan stattfinden soll. Lassen Sie mich hier ein Beispiel geben. Schedule 1 bedeutet, dass am Montag, den 27. August 2012, von 08.30 bis 10.00 Uhr eine Reservierung erfolgt. Da es am selben Tag beginnt und endet, ist dies nur eine Tagesreservierung in room1. Scheduled 3 bedeutet jedoch, dass eine Reservierung am 28. August 2012, Dienstag, und bis zum 30. August 2012, Donnerstag um 08: 30-12: 00 Uhr beginnt. Mit anderen Worten, es dauert 3 Tage und jeden Tag ab 08:30 bis 12:00 ... Also gibt es eine Reservierung von Dienstag bis Donnerstag von 08:30 bis 12:00 Uhr in Room2 ... Ich hoffe, das ist klar.

Tabelle C: Ausrüstungen in dem verwandten Schema 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 | 
+--------+------------+------+-------------+ 

In Tabelle: AUTOID einzigartige automatische Identifikation von Auto-Inkrement erzeugt darstellen, scheduleid aus Tabelle B kommt, eqid kommt aus Tabelle A, amountInSch darstellt, wie viele (Mengen-) Ausrüstung wird in dem zugehörigen Plan verwendet. Ich möchte hier ein Beispiel geben. Schedule 1 in Tabelle C gibt es 3 Zeilen. Das bedeutet, dass Schedule 1, das in TAble B verwendet wird, 2 Bücher (eqid 1), 3 Stifte (eqid 2) und 1 Computer (eqid 3) in den in Tabelle 1 angegebenen Daten und Zeiten in Tabelle B verwendet. Ein anderes Beispiel ist, dass Schedule 3 in Tabelle C 2 Zeilen betrifft. Das bedeutet, dass 1 Stift (eqId 2) und 3 Computer (eqId 3) vom 27. bis 30. August 2012 täglich von 08:30 bis 12:00 Uhr in room2 verwendet werden.

Oben finden Sie die Erklärung und einige Informationen über das Projekt. Die Tabellenzeilen sind nicht permanent. Wenn Sie eine Reservierung machen, wird es eine neue Zeile in der Tabelle B sein, und wenn es ein Gerät ausgewählt wird, wird es neue Zeilen in der Tabelle C ...

Die Frage:

ich links berechnet werden soll Menge eines bestimmten Equipments, wenn ich eqId, startDate, endDate, startTime und endTime ...

Ein Beispiel:

eqId: 1 (Buch)

startdate: 2012-08-27

endDate: 2012-08-27

Startzeit: 08.30.00

endTime: 12.00.00

Ergebnis sein sollte: 14 Bücher in sChE verwendet Dule und 76 verfügbare Bücher verfügbar

Weil: Wenn Sie scheduleId und verwandte eqIds aussehen, sehen Sie nur 1, 2, 6, 7, 9 scheduleIds im Zusammenhang mit meiner Abfrage (Daten und eqId). Wenn Sie die gesamte Menge der in Tabelle C verwandten Menge summieren, erhalten Sie das falsche Ergebnis. Mit anderen Worten sind verwandte Mengen für eqId (1-Buch) und für 1, 2, 6, 7, 9 scheduleIds 2, 1, 1, 5, 8 jeweils. Also, wenn Sie sie summieren, erhalten Sie 17, was falsch ist. Weil der Zeitplan für 1 und 9 sich nicht in Bezug auf Anfangs- und Endzeiten schneidet und sich 6 und 7 auch nicht schneiden. infolgedessen bleibt 2 einsam und kann getrennt gezählt werden. Wir müssen 1 und 9 als summierte 8 betrachten, weil 8 größer als 2 ist. Es ist das Gleiche für 6 und 7, betrachtet als 5 wegen 5 ist größer als 1 ...

So Leute! Ich bin mir nicht sicher, wie ich das im Programmieralgorithmus summieren kann. Gibt es eine Möglichkeit in SQL zu arbeiten oder muss ich PHP und Mysql zusammen verwenden? und wie?

SQLFiddle Records

+0

Ohne eine Idee zu haben (tut mir leid) ... wäre es nicht einfacher 'DATETIME'-Spalten anstelle von' DATE'- und 'TIME'-Spalten zu verwenden? Und dann: Wenn ein Zeitplan von 9:00 bis 10:00 Uhr und der nächste von 10:00 bis 11:00 Uhr ist, wäre es möglich, ein Gerät zu verwenden, wenn beide nicht im selben Raum sind? Sie müssten sie von X nach Y transportieren, was normalerweise einige Zeit in Anspruch nimmt. Vielleicht ist "nicht schneiden" hier nicht stark genug. – Jens

+0

@Jens ist es möglich, die Geräte von Raum zu Raum zu tragen. Und es wird Pausen zwischen den Zeitplänen geben. Es wurde so für DATE und TIME Felder gestartet, so dass es schwer ist, es jetzt zu ändern ... – deepnote

Antwort

0

Es gibt verschiedene Wege, dies zu erreichen - ich werde dich auf etwas verweisen, die mit den meisten DB-Motoren verwendet werden kann.

In mysql ist es möglich, Tabellen in einer einzigen Abfrage zusammenzuführen. Was Sie brauchen, ist etwas entlang der Linie dafür:

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

Der Trick besteht darin, die table_b`.`scheduleid` = `table_c`.`scheduleid zu verwenden (einige Zitate fehlen wegen hier Markup) die beiden Tabellen zu verschmelzen.

+0

das funktioniert nicht. Wenn ich diese Abfrage wie "SELECT SUMME (' mengeInSch') FROM 'Table3',' Table2' WHERE 'eqid' = 1 UND' startDate' <= '2012-08-27' UND 'endDate'> = '2012 -08-27 'UND 'startTime' <= '08: 30: 00' UND' endTime'> = '12: 00: 00 'UND 'Table2'.scheduleid' = ' Tabelle3''scheduleid' " , sein Ergebnis ist NULL. und das scheint mir nicht logisch, da es nur SUM mengeInSch Feld ist. Sie sollten Zeit in Betracht ziehen, die sich schneidet ... – deepnote

+0

Es scheint, dass ich versehentlich die Logik umdrehte - alles <= sollte> = sein und umgekehrt. Ich bearbeite meine Antwort oben, um korrekt zu erscheinen. – ipoga

+0

umgekehrt ist Teil jetzt in Ordnung, aber das Ergebnis ist falsch. Es sollte 14 nicht 16 sein ... – deepnote

Verwandte Themen