Reservierungssystem

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Reservierungssystem

    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"
    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')
                    )
                )
    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!

  • #2
    Hallo,

    wenn du wissen willst, ob ein Zeitraum Z sich mit einer Reservierung R überschneidet, reicht die Bedingung Z.ende > R.anfang AND Z.anfang < R.ende. Deine ist zwar nicht falsch, aber etwas umständlicher.

    Da du genau so viele Joins benötigen würdest, wie es Reservierungen gibt, die in diesen Zeitraum fallen, ist die Lösung nur mit SQL nicht praktikabel. Allerdings stellt deine SQL-Abfrage bereits eine sinnvolle Ausgangssituation dar, die man jetzt mit PHP weiter verfeinern könnte.

    Ich würde also erstmal das sum() gegen ein paar nützliche Spaltenreferenzen austauschen und die Reservierungen nach Anfangsdatum sortieren, damit du die Datensätze ungruppiert bekommst und diese dann mit PHP hinsichtlich Überlappungen untersuchen kannst.

    Gruß,

    Amica
    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
    Super, danke!
    [/COLOR]

    Kommentar

    Lädt...
    X