Lord_Aratorn Geschrieben 5. August 2009 Teilen Geschrieben 5. August 2009 Hi, ich sitze hier, und bin fast am verzweifeln. Also ich habe eigentlich ein ziemlich einfaches Problem. Ich habe mehrere Benutzer, die alle ein Auto mieten können, und zwar von einem Zeitpunkt eine gewisse Anzahl an Tagen. Dabei darf ein Auto nicht von 2 Leuten gemietet werden ich habe aktuell 2 Tabellen. USERS( login, name, name,.....) CARS (carid, rentingdate, duration, endingdate) Meine Abfrage, die ich bisher habe Select * from CARS where carid = $carid and urentingdate < rentingdate and uendingdate > endingdate ich habe aber stehts das problem, dass ein auto mehrmals belegt wird. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
T3D Geschrieben 5. August 2009 Teilen Geschrieben 5. August 2009 Ich verstehe das Problem noch nicht so ganz, füg in dem SQL einfach den "vorraussichtlichen" verleihzeitraum ein und ueberpruefe ob es in diesem Zeitraum bereits verliehen ist?! Ted Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Lord_Aratorn Geschrieben 5. August 2009 Autor Teilen Geschrieben 5. August 2009 also dann baue ich mal ne schöne grafik ____Cars____ carid|ausleihdatum|ausleihzeitraum|rückgabe|user 1 | 0.1.09 | 4 | 5.1.09 | max 2 | 7.1.09 | 3 | 10.1.09 | knut 1 | 7.1.09 | 6 | 13.1.09 | Horst wenn nun Frank auto 1 mieten will und zwar vom 2.1.09 bis 15.1.09 muss mir die abfrage false liefern oder 0 datensätze Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 5. August 2009 Teilen Geschrieben 5. August 2009 Ich denke nicht, dass das mit 2 Entities funktioniert, denn Du hast die User und die Cars. Ein User kann immer genau ein Auto in einem Zeitraum mieten, d.h. Du hast zwischen User und Auto eine N:M Verknüpfung, die dann noch abhängig vom Zeitraum ist Phil Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Lord_Aratorn Geschrieben 5. August 2009 Autor Teilen Geschrieben 5. August 2009 warum sollte es nicht mit 2 Entitys machbar sein? Ich habe alle benötigten Informationen. Der einzige Grund warum 2 Entitys schlecht sind, sind die Redundanzen, aber die habe ich eh. Ich habe gedacht, dass ich das Query 2x ausführe und miteinander joine. Und dann in dem Join schaue ob es einen Zeitraum gibt, den ich belegen kann. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dbwizard Geschrieben 6. August 2009 Teilen Geschrieben 6. August 2009 warum sollte es nicht mit 2 Entitys machbar sein? Ich habe alle benötigten Informationen. Bist du sicher ? Dann hast du aber nicht alle Informationen gepostet... ich habe aktuell 2 Tabellen. USERS( login, name, name,.....) CARS (carid, rentingdate, duration, endingdate) - Du hast alle Benutzer - Du hast die Verleihdaten der Wagen - Aber : Welcher Benutzer welchen Wagen "besetzt" hält, gibt es nicht ??...(Siehe die Antwort von Flashpixx) Gruss Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 6. August 2009 Teilen Geschrieben 6. August 2009 Du kennst die Normalisierungsformen 1 bis 3? Phil Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
T3D Geschrieben 6. August 2009 Teilen Geschrieben 6. August 2009 So wirklich seh ich immernoch nich wo dein Problem ist.. vielleicht bin ich einfach nur zu doof?! aber wenn du: wenn nun Frank auto 1 mieten will und zwar vom 2.1.09 bis 15.1.09 muss mir die abfrage false liefern oder 0 datensätze machen moechtest... ist das doch ne ganz einfache logische abfrage?! Select * from CARS where carid = 1 AND '2009-01-02' NOT BETWEEN rentingdate and endingdate AND '2009-01-15' NOT BETWEEN rentingdate and endingdate [/PHP] Ted Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 6. August 2009 Teilen Geschrieben 6. August 2009 Mich würden ja mal die Keys interessieren, denn carid kann es ja nicht sein, denn dann lässt sich das Auto auch nur einmal verleihen. Die Kombination aus carid, rentingdate und endingdate macht auch keinen Sinn, denn das Auto 1 ist ja am 1.4 bis 10.4 und am 1.8 bis 2.8 immer noch das Auto 1 und ändert sich nicht. Außerdem ist es inner sinnvoll zu sagen, welchen Datentyp die Datumsfelder haben (date, timestamp, unixtimestamp) Phil Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Lord_Aratorn Geschrieben 6. August 2009 Autor Teilen Geschrieben 6. August 2009 Bist du sicher ? Dann hast du aber nicht alle Informationen gepostet... - Du hast alle Benutzer - Du hast die Verleihdaten der Wagen - Aber : Welcher Benutzer welchen Wagen "besetzt" hält, gibt es nicht ??...(Siehe die Antwort von Flashpixx) Gruss Ach stimmt, mein Fehler. Natürlich sieht die Tabelle Cars so aus CARS (carid, rentingdate, duration, endingdate, login) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 6. August 2009 Teilen Geschrieben 6. August 2009 CARS (carid, rentingdate, duration, endingdate, login) Was hat bitte ein "login" in der Car-Entitiy zu suchen? Warum hast Du eine duration, wenn Du Start und Endzeit hast? zu meinem letzten Post Welche Datentypen verwendest Du? Wie sehen die Schlüssel auf der Tabelle aus? Phil Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dbwizard Geschrieben 6. August 2009 Teilen Geschrieben 6. August 2009 Was hat bitte ein "login" in der Car-Entitiy zu suchen? Warum hast Du eine duration, wenn Du Start und Endzeit hast? zu meinem letzten Post Welche Datentypen verwendest Du? Wie sehen die Schlüssel auf der Tabelle aus? Phil Hi, So wie ich es verstehe, ist dies eigentlich nicht die "CAR" Eintität, sondern "Buchungen" oder "Ausleihen" ,wie auch immer. Eine Entität "CAR" hat er nicht.Das Login wäre in diesem Fall der FK auf den Benutzer...aber dieses Datenmodell ist sicher renovationsbedürftig :-). na ja... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Lord_Aratorn Geschrieben 6. August 2009 Autor Teilen Geschrieben 6. August 2009 USERS( login:varchar16, name:varchar16, nam:varchar16,.....) CARS (carid:int, rentingdate:date, duration:int, endingdate:date, login:forreignkey aus USERS) zu meinem Vorposter, ja quasi ist Cars eine Buchungstabelle. Ich wollte die Anzahl an Tabellen gering halten. Man könnte natürlich auch jeweils eine Tabelle für USERS,CARS,RENT wobei dies die Beziehungen beider abbildet. Ich könnte natürlich auch IDs eiführen, jedoch halte ich dies für überflüssig Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 6. August 2009 Teilen Geschrieben 6. August 2009 Und was ist auf Cars der PK? Ich kann jetzt aus dem FK in Cars folgern, dass der Login PK auf Users ist. Lass Dir doch nicht alles aus der Nase ziehen Phil Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
T3D Geschrieben 6. August 2009 Teilen Geschrieben 6. August 2009 Und was ist auf Cars der PK? es spielt doch fuer das was er nun machen will gar keine Rolle?! es ist egal ob nun PK -> carsid + rentingdate oder carsid + endingdate <- ist oder gar alle 3 zusammen. das es nicht normalisiert ist, hatte er auch schon selbst zugegeben. und die eigentlich Frage war ja wenn nun Frank auto 1 mieten will und zwar vom 2.1.09 bis 15.1.09 muss mir die abfrage false liefern oder 0 datensätze und da sind die PKS total irrrelavant Ted Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Lord_Aratorn Geschrieben 6. August 2009 Autor Teilen Geschrieben 6. August 2009 (bearbeitet) Also nun habe ich die Tabellen ein wenig umgebaut. Ich habe nun 3 USERS( login:varchar16, name:varchar16, nam:varchar16,.....) CARS (carnr:int, preis/tag:double, anzahlreifen:int) RESERVATIONS (rentid: int, carnr: int (FK aus CARS) rentingdate:date, endingdate:date, login:varchar(FK aus USERS) nun muss stehe ich aber immernoch vor meinem alten problem: Select * from RESERVATIONS where carnr = $carnr AND $uin_date NOT BETWEEN rentingdate and endingdate AND $uout_date NOT BETWEEN rentingdate and endingdate [/PHP] erhalte ich nicht das gewünschte, vielmehr kann ich nicht nachvollziehen warum ich die Ausgabe erhalte, die ich erhalte. Ich bekomme stehts datensätze, auch wenn das auto eigentlich frei sollte. Bearbeitet 6. August 2009 von Lord_Aratorn Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 6. August 2009 Teilen Geschrieben 6. August 2009 Du holst die Daten ja auch nur aus der Tabelle Cars. Du musst eine Join zwischen den Tabellen mit Condition machen Phil Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Lord_Aratorn Geschrieben 6. August 2009 Autor Teilen Geschrieben 6. August 2009 (bearbeitet) sry wieder verschrieben RESERVATIONS muss es heißen ich vermute mal, dass die Abfrage FALSE liefert, bei folgender Situation ......................|----dur1-----|.........................|-------dur2--------| ................................................................................................ ........^...............................................^.................................... .........|.----------abfragedur--------------|.................................... ....start.............................................end................................ obwohl das Auto in dem zwischenraum vermietet wird Bearbeitet 6. August 2009 von Lord_Aratorn Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
T3D Geschrieben 6. August 2009 Teilen Geschrieben 6. August 2009 Ich hab das gerade mal mit deiner neuen Tabelle ausprobiert. meinen SQL von Seite eins etwas erweitert, kann man allerdigns sicher noch etwas anders machen Select if(count(id) > 0, 'NEIN', '') as 'kann verliehen werden' from rents where carnr = 1 AND ( '2008-12-03' BETWEEN rentingdate and endingdate OR '2009-12-04' BETWEEN rentingdate and endingdate OR rentingdate BETWEEN '2008-12-03' AND'2009-12-04' OR endingdate BETWEEN '2008-12-03' AND '2009-12-04' ) GROUP BY carnr edit: damit is dann auch dein problem ausm letzten post behoben Ted Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Lord_Aratorn Geschrieben 6. August 2009 Autor Teilen Geschrieben 6. August 2009 Oh vielen Dank T3D, funktioniert Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.