Ilja: schwierige Abfrage MySQL

Beitrag lesen

moin,

Bei deinem Beispiel würde ich dann zu GROUP BY greifen.
Jedoch versteh ich dein MIN / MAX hinweis nicht, ich kenne diese Begriffe nur im Zusammenhang mit GROUP BY ... um den höchsten oder niedrigsten wert zu ermitteln bzw für die HAVING Bedingung.

es gibt sicherlich immer viele wege, die nach rom führen. welcher machbar ist, hängt auch immer von dem report ab, den man haben will. bei GROUP BY kannst du neben den aggregat-funktionen nur die spalten ausgeben, über die du auch gruppiert hast, nicht mehr und nicht weniger. du willst aber manchmal noch mehr spalten ausgeben, kannst aber die gruppierung nicht verändern. dann kommt es oftmals zum einsatz von korrelierten unterabfragen.

MIN / MAX kommt hier mit ins spiel, weil er nach einen bestimmten maximal wert fragt, also in dem falle MAX. pseudo code könnte so aussehen:

verbinde die drei tabellen vehicles, vehicles2trips, und trips, zeige mir davon alle spalten.

SELECT *
FROM vehicles v
INNER JOIN vehicles2trips vt ON vt.vehicleid  = v.id
INNER JOIN trips t ON t.id = vt.tripid
;

und von all den datensätze will ich nur die datensätze haben, mit einer bestimmten vehicle id und deren startdatum kleiner als ein bestimmer wert.

SELECT *
FROM vehicles v
INNER JOIN vehicles2trips vt ON vt.vehicleid  = v.id
INNER JOIN trips t ON t.id = vt.tripid
WHERE v.id = 15
AND t.starttime <= '31.12.2009'
;

und von den datensätzen, die noch übrig bleiben, nur den mit dem höchsten startdatum.

SELECT *
FROM vehicles v
INNER JOIN vehicles2trips vt ON vt.vehicleid  = v.id
INNER JOIN trips t ON t.id = vt.tripid
WHERE v.id = 15
AND t.starttime <= '31.12.2009'
AND t.starttime = (SELECT MAX(t2.starttime )
                   FROM vehicles2trips vt2
                   INNER JOIN trips t2 ON t2.id = vt2.tripid
                   WHERE vt2.vehicleid  = v.id
                   AND t2.starttime <= t.starttime
                  )
;

schränke ich es nicht auf ein bestimmtes vehicle ein, kann ich mir das sogar für jedes farzeug zeigen lassen.

SELECT *
FROM vehicles v
INNER JOIN vehicles2trips vt ON vt.vehicleid  = v.id
INNER JOIN trips t ON t.id = vt.tripid
WHERE t.starttime <= '31.12.2009'
AND t.starttime = (SELECT MAX(t2.starttime )
                   FROM vehicles2trips vt2
                   INNER JOIN trips t2 ON t2.id = vt2.tripid
                   WHERE vt2.vehicleid  = v.id
                   AND t2.starttime <= t.starttime
                  )
;

Ilja