Tobias Hahner: schwierige Abfrage MySQL

Beitrag lesen

Hallihallo!

also eine typische m:n beziehung zwischen den entitätstypen vehicles und trips. und für mich ist es nicht unsinning, noch mal einen zusätzlichen PK wer in der beziehungstabelle zu führen. du solltest aber die beiden fremdschlüssel NOT NULL setzen und einen UNIQUE Key über beide spalten bilden.

Ja, das ist auch schon so gelöst. Nur hatte ich das aus Gründen der Übersichtlichkeit hier nicht dargelegt.

"Gib mir den letzten 'trip', dessen starttime kleiner ist als "giventime", und der in 'vehicles2trips' mit "given_vehicleid" verknüpft ist."

zum einen könnte man sich ja auch vorstellen, dass ein fahrzeug nicht auf einem "trip" ist, sondenr im fuhrpark steht. dazu brauchst du dann aber einen zweiten zeitwert bis wann ein trip geht.

Das kam mir auch schon in den Sinn. Das Problem mit "es gibt keine Trips" habe ich im Frontend folgendermassen gelöst:
Da gelegentlich auch mal Fahrzeuge dazugemietet werden, wird auch die Verfügbarkeit des Fahrzeugs (availablefrom, availabletill) in der Tabelle "vehicles" festgehalten. (Da diese beiden Spalten Nichts mit dem eigentlichen Problem zu tun haben, habe ich sie im OP unterschlagen und unter "weitere unwichtige Eigenschaften" zusammengefasst... Da steht noch viel mehr drin, z.B. maximales Zuladegewicht, TüV- Intervall, Inspektionsintervall usw...)
Wie dem auch sei, vom Frontend aus trage ich für jedes neue Fahrzeug auch einen Trip ein, und zwar mit date=availablefrom und destinationid=0 (Lager).

Zudem geht es in meiner Abfrage ja genau darum, nicht einen Trip zu finden, der GENAU JETZT stattfindet, sondern den LETZTEN VOR einem gegebenen Datum.

mit einer korrelierten unterabfrage. aber noch ein hinweis, der OUTER JOIN ist falsch herum. du musst von vehicles ausgehen, schließlich kann es ja sein, dass das fahrzeug noch nie auf einem trip war. und dann wird es kniffelig, du musst die korrelierte unterabfrage auch noch in die ON klausel des OUTER JOINS einbauen, eben weil aus oben genannten bedinungen nicht jedes fahrzeug auch einen trip haben muss.

Wie gesagt: der Fall, dass es keinen Trip gibt, kann nicht auftreten: Jedes Fahrzeug hat mindestens einen Trip, und zwar hin zum Lager.

allerdings würde ich mir vorher erst mal überlegen, ob du nicht neben der startzeit eines trips auch noch das ende festhälst.

Das habe ich absichtlich nicht getan, und zwar aus folgendem Grund: Die Einträge in der Tabelle "trips" sind (ursprünglich) für die Zukunft gedacht. Sprich: Planung von noch anstehenden Touren. Die Erfahrung hat gezeigt, dass das tatsächliche Ende eines Trips so gut wie nie mit dem theoretischen Ende übereinstimmt.
Deswegen wird diese Information schlicht ignoriert, und die Fahrzeuge werden auf der Planungsskizze einfach "gebeamt" [1] :) (und nein, es besteht kein Bedarf nach einer Routine, die aus der Erfahrung lernt und das Ende von geplanten Trips zuverlässiger ermittelt :) )

Ilja

Beste Grüsse,
   Tobias Hahner

[1] beamen heisst hier: Fahrzeug fährt los, und ist gleichzeitig am Zielort