Hallo zusammen,
Vorab: Ich bin mir nicht sicher, ob ich hier an der richtigen Stelle poste, lasse mich also gerne korrigieren.
Ich beschreibe hier ein MySQL-Problem, das sich wahrscheinlich nur mit Hilfe von PHP lösen lässt...
Mich plagt seit einigen Tagen ein Problem, zu dem ich keine elegante Lösung finde. Ich schreibe ein Reservierungssystem und bekomme eine bestimmte Ausgabe nicht hin. Folgende Situation, vereinfacht dargestellt:
Eine Table "Artikel"
Eine Tabelle "Projekte"
Eine Tabelle "Reservierung"
Die Tabelle Artikel enthält Artikelstammdaten und einen Gesamtbestand pro Artikel.
Die Tabelle Projekte enthält aktive Projekte mit einem Start- und Enddatum.
Die Tabelle Reservierung stellt vorhandene Artikelreservierungen zu Projekten dar.
In den Tabellen oben kann man hoffentlich erkennen, dass für Projekt 2-4 schon "Messer" gebucht sind, bei den ersten beiden Reservierungen jeweils 2 Stück, bei der dritten Reservierung 3 Stück.
Nun soll für das Projekt1-Datum eine Bestandsanfrage gemacht werden, wieviele Messer zu diesem Zeitraum schon reserviert sind.
Ich nutze dazu diese Abfrage:
Die Ausgabe ist insofern korrekt, dass alle Reservierungen die sich irgendwo mit der Anfrage überschneiden addiert werden.
Nun gibt es das eine für mich schwierige Problem:
Die Anfrage ergibt eine Ausgabe von 7 reservierten Messern.
Wenn man sich nun Reservierung 2 und 3 ansieht erkennt man leicht, dass diese Reservierungszeiträume sich nicht überlappen.
Mein Verstand sagt mir, dass also nicht 7 Messer im Anfragezeitraum reserviert sind sondern nur maximal 5.
Das müsste die Ausgabe berücksichtigen.
Nochmal in anderen Worten:
Wenn im Anfragezeitraum mehrere Reservierungen bestehen, die hintereinander ohne Überschneidung stattfinden, darf nur die umfangreichste aller Reservierungen addiert werden.
Alle Workarounds über PHP die ich bisher versuchte waren vieel zu langsam!
Hat jemand eine Idee? Hilfe?
Schonmal danke für die Lesegeduld die alle Leser mitbringen!
Vorab: Ich bin mir nicht sicher, ob ich hier an der richtigen Stelle poste, lasse mich also gerne korrigieren.
Ich beschreibe hier ein MySQL-Problem, das sich wahrscheinlich nur mit Hilfe von PHP lösen lässt...
Mich plagt seit einigen Tagen ein Problem, zu dem ich keine elegante Lösung finde. Ich schreibe ein Reservierungssystem und bekomme eine bestimmte Ausgabe nicht hin. Folgende Situation, vereinfacht dargestellt:
Eine Table "Artikel"
Code:
ID | Artikel | Anzahl | ------------------------- 1 | Messer | 10 | 2 | Gabel | 5 | 3 | Schere | 5 | .. ... ..
Eine Tabelle "Projekte"
Code:
ID | Projekt | ProjStart (DATETIME) | ProjEnde (DATETIME) | ------------------------------------------------------------- 1 | Proj1 | 2012-02-10 12:00:00 | 2012-02-20 12:00:00 | 2 | Proj2 | 2012-02-06 12:00:00 | 2012-02-16 12:00:00 | 3 | Proj3 | 2012-02-12 12:00:00 | 2012-02-14 12:00:00 | 4 | Proj4 | 2012-02-15 12:00:00 | 2012-02-16 12:00:00 | .. | ... | .... | .... |
Eine Tabelle "Reservierung"
Code:
ID | Projekt | Artikel | Anzahl | ---------------------------------- 1 | 2 | 1 | 2 | 2 | 3 | 1 | 2 | 3 | 4 | 1 | 3 |
Die Tabelle Artikel enthält Artikelstammdaten und einen Gesamtbestand pro Artikel.
Die Tabelle Projekte enthält aktive Projekte mit einem Start- und Enddatum.
Die Tabelle Reservierung stellt vorhandene Artikelreservierungen zu Projekten dar.
In den Tabellen oben kann man hoffentlich erkennen, dass für Projekt 2-4 schon "Messer" gebucht sind, bei den ersten beiden Reservierungen jeweils 2 Stück, bei der dritten Reservierung 3 Stück.
Nun soll für das Projekt1-Datum eine Bestandsanfrage gemacht werden, wieviele Messer zu diesem Zeitraum schon reserviert sind.
Ich nutze dazu diese Abfrage:
Code:
SELECT sum(Reservierung.Anzahl) FROM Reservierung,Projekte WHERE Projekte.id=Reservierung.Projekt AND Reservierung.Artikel='1' AND ( ( ('2012-02-10 12:00:00' BETWEEN Projekte.ProjStart AND Projekte.ProjEnde) OR ('2012-02-20 12:00:00' BETWEEN Projekte.ProjStart AND Projekte.ProjEnde) ) OR ( (Projekte.ProjStart BETWEEN '2012-02-10 12:00:00' AND '2012-02-20 12:00:00') OR (Projekte.ProjEnde BETWEEN '2012-02-10 12:00:00' AND '2012-02-20 12:00:00') ) )
Nun gibt es das eine für mich schwierige Problem:
Die Anfrage ergibt eine Ausgabe von 7 reservierten Messern.
Wenn man sich nun Reservierung 2 und 3 ansieht erkennt man leicht, dass diese Reservierungszeiträume sich nicht überlappen.
Mein Verstand sagt mir, dass also nicht 7 Messer im Anfragezeitraum reserviert sind sondern nur maximal 5.
Das müsste die Ausgabe berücksichtigen.
Nochmal in anderen Worten:
Wenn im Anfragezeitraum mehrere Reservierungen bestehen, die hintereinander ohne Überschneidung stattfinden, darf nur die umfangreichste aller Reservierungen addiert werden.
Alle Workarounds über PHP die ich bisher versuchte waren vieel zu langsam!
Hat jemand eine Idee? Hilfe?
Schonmal danke für die Lesegeduld die alle Leser mitbringen!
Kommentar