Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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.

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

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

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

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.

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

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

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

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)

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

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...

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

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

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 von Lord_Aratorn

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 von Lord_Aratorn

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

Oh vielen Dank T3D, funktioniert

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.