MySQL JOIN Problem reloaded

...komplette Frage anzeigen

4 Antworten

Hello there,

ich bin gerade etwas verwirrt, ich versteh deine Logik nicht.

Auf der einen Seite sagst du, es soll gefiltert werden, nach allen Einträgen, bei denen das ENDE-Datum NICHT in der Vergangenheit liegt, aber dennoch sollen ALLE Autos angezeigt werden? Des versteh ich nicht.

Oder willst du praktisch schon alle Autos haben, aber dann wenn alle Autos angezeigt werden, da dann nur noch die Einträge, die in der Zukunft liegen, außer es ist keiner in der Zukunft da? Das würde noch Sinn machen, dafür könnte ich auch ne Query designen.

Erklärs mir bitte nochmal.

MfG

Alex

In Microsoft SQL geht das so:

Select fahrzeug_id, ende_datum INTO #aktuelle FROM Vermietung WHERE ende_datum > getdate()

SELECT fahrzeug_id, MAX(ende_datum) INTO #vergangene FROM Vermietung WHERE fahrzeug_id NOT IN (SELECT fahrzeug_id FROM #aktuelle)

Den Rest schaffst Du selber ;-)

TomRichter 08.02.2015, 00:04

Sorry, im zweiten Statement hatte ich das "group by Fahrzeug_id" vergessen.

1
Ich möchte aber nur die Einträge haben, deren ende_datum NICHT in der Vergangenheit liegen, aber jedes Fahrzeug soll mindestens einmal ausgegeben werden.

Da tippe ich auf eine UNION-Clause.

Sprich: Wenn es in der Tabelle "Vermietung" für ein Fahrzeug nur Einträge gibt, die in der Vergangenheit liegen, dann soll dieses Fahrzeug trotzdem einmal ausgegeben werden.

Welcher?

Wie kann ich das erreichen?

Beantworte ich dir nach Antwort auf meine Rückfrage (es wird etwas rechenlastig, da ich nicht optimieren werde).

cg1967 09.02.2015, 18:48
select * from Fahrzeuge, Vermietung 
    where fahrzeug_id = id and start_datum > curdate()
union
select id, modell, fall_id, fahrzeug_id, max(start_datum) as start_datum, max(ende_datum) as ende_datum from Fahrzeuge, Vermietung 
    where fahrzeug_id = id 
    and fahrzeug_id not in 
        (select fahrzeug_id from Vermietung 
        where start_datum > curdate()) 
        group by fahrzeug_id
union
select id, modell, 0,NULL,NULL,NULL from Fahrzeuge, Vermietung 
    where id not in 
        (select fahrzeug_id from Vermietung 
        group by fahrzeug_id)
;

Dies sind alle Buchungen ab CURDATE (falls du DATE verwendet hast, bei DATETIME nimm NOW()), die letzte, falls keine aktuellen vorliegen und die Fahrzeuge, welche noch nie gebucht wurden.

0
cg1967 09.02.2015, 18:54
@cg1967

Ersetze "start_datum > curdate()" durch "ende_datum > curdate()" 2*.

0

wäre left outer join hilfreich? und dazu ein where für datum: ende_datum > NOW()

Was möchtest Du wissen?