2016-04-18 15 views
0

Ich versuche eine Auswahl zu treffen, die die Gesamtanzahl der verfügbaren Autos für ein bestimmtes Zeitfenster (2016-04-22 bis 2016-04-23) für ein bestimmtes Ziel anzeigt.MySQL - Verfügbare Daten suchen

In diesem Fall möchte ich sehen, wie viele Autos in Mandal zu vermieten sind. In meiner Anfrage wurde mir aber auch die Gesamtanzahl der verfügbaren Autos angezeigt, obwohl ich das Ziel angegeben habe.

SELECT destination, COUNT(destination) AS 'available cars' 
FROM cars 
LEFT JOIN orders 
    ON cars.id = orders.car_id 
WHERE orders.car_id IS NULL 
    OR date_to NOT BETWEEN '2016-04-22' AND '2016-04-23'  
    AND date_from NOT BETWEEN '2016-04-22' AND '2016-04-23' 
    AND destination = 'Mandal' 
GROUP BY destination 

Ausführen der Abfrage oben gibt mir die folgende Tabelle: http://i.stack.imgur.com/Ck0s0.png

Zusammen mit den verfügbaren Autos in Mandal es, die noch ist es richtig angezeigt werden soll, nicht auch nur eine vorhandene Auto in Stavanger zurück . In Stavanger sollen zwei Autos verfügbar sein (eines, das zu einer anderen Zeit geleast wird, NOT BETWEEN '2016-04-22' AND '2016-04-23', und eines, das noch nicht geleast wurde, orders.car_id IS NULL). Die Anzahl der verfügbaren Autos in Mandal ist jedoch korrekt.

+1

Verwenden Sie Klammern. UND bindet stärker als OR –

+1

Beispieldaten und gewünschte Ergebnisse würden helfen zu vermitteln, was Sie versuchen zu tun. –

+0

Welches DBMS benutzen Sie? –

Antwort

1

Runde Klammern sind sehr wichtig, wenn komplexe WHERE Klauseln bauen, da sie zu einer Gruppe verwendet werden können „im Bereich“, wie Sie gerade verwenden:

SELECT destination, 
      COUNT(sted) AS 'available cars' 
    FROM cars 
LEFT JOIN orders ON cars.id = orders.car_id 
    WHERE (orders.car_id IS NULL) 
     OR (date_to NOT BETWEEN '2016-04-22' AND '2016-04-23')  
     AND (date_from NOT BETWEEN '2016-04-22' AND '2016-04-23') 
     AND (destination = 'Mandal') 
GROUP BY destination 

Sie möchten können auch entsprechende Einstellung Ihrer Bereiche zu prüfen, einfach weniger zu verwenden, als/größer-als-Option, um mehr den Bereich genau zu zielen (im Gegensatz zu den BETWEEN Aussagen gegenüber), und es könnte ein bisschen leichter zu lesen:

WHERE (date_from <= '2016-04-23' AND date_to >= '2016-04-22') 
+0

Es stellte sich heraus, Paranthesen war das Problem. 'WHERE (orders.car_id IST NULL ODER (date_to NICHT ZWISCHEN '2016-04-22' UND '2016-04-23') UND date_from NICHT ZWISCHEN '2016-04-22' UND '2016-04-23')) UND destination = 'Mandal' hat mir das gewünschte Ergebnis gegeben. Vielen Dank! – robert

1

ich, dass die where co stark vermuten, Bedingungen ausgebracht müssen in der on Klausel gehen:

SELECT destination, COUNT(sted) AS availablecars 
FROM cars c LEFT JOIN 
    orders o 
    ON c.id = o.car_id AND 
     date_to BETWEEN '2016-04-22' AND '2016-04-23' AND 
     date_from BETWEEN '2016-04-22' AND '2016-04-23' AND 
     destination = 'Mandal' 
WHERE o.car_id IS NULL 
GROUP BY destination; 

Ohne Beispieldaten, ich bin nicht 100% sicher. Es ist auch möglich, dass die Datumsbedingungen wie folgt lauten:

 ON c.id = o.car_id AND 
     date_to >= '2016-04-22' 
     date_from <= '2016-04-23' AND 
     destination = 'Mandal' 
+0

Hallo @GordonLinoff, ich habe die Frage jetzt mit den gewünschten Ergebnissen aktualisiert. – robert