php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 09-02-2012, 05:44
n8diver
 Registrierter Benutzer
Links : Onlinestatus : n8diver ist offline
Registriert seit: Feb 2012
Ort: Frankfurt a.M.
Beiträge: 1
n8diver befindet sich auf einem aufstrebenden Ast
Post 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!
Mit Zitat antworten
  #2 (permalink)  
Alt 09-02-2012, 09:43
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

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
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Einzelauftrag] Integration von I-Payment in vorhandenes Reservierungssystem user1949 Jobgesuche 1 16-06-2008 20:23
Projekt abzugeben PHP/MYSQL Hotel Reservierungssystem seballa Projekthilfe 2 01-08-2004 11:55

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

Die RIGID-FLEX-Technologie
Die RIGID-FLEX-TechnologieDie sogenannte "Flexible Elektronik" , oftmals auch als "Flexible Schaltungen" bezeichnet, ist eine zeitgemäße Technologie zum Montieren von elektronischen Schaltungen.

06.12.2018 | Berni

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni


 

Aktuelle PHP Scripte

HeidiSQL - kostenloses MySQL front-end Editor für Windows ansehen HeidiSQL - kostenloses MySQL front-end Editor für Windows

HeidiSQL - ist ein Windows-Editor für die bekannt open Source Datenbank mySQL

10.12.2018 Berni | Kategorie: MYSQL/ Management
piwik Open-Source Webanalyse-Software ansehen piwik Open-Source Webanalyse-Software

piwik ist eine gute Alternative zu Google Analytics. Viele Features und ein modernes Erscheinungsbild mit aussagefähigen Statistiken in Echtzeit

10.12.2018 phpler | Kategorie: PHP/ Besucherzaehler
jQuery Mobile ansehen jQuery Mobile

Touch-Optimized Web Framework für Smartphones & Tablets

09.12.2018 phpler | Kategorie: AJAX/ Framework
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 06:28 Uhr.