2016-10-16 2 views
0

Ich bin ein bisschen stecken, versucht, eine ziemlich komplexe auf SQL, und insbesondere MySQL.SQL konsekutive Vorkommen für Verfügbarkeit basierte Abfrage

Die Datenbank beschäftigt sich mit Mietwagen, sowie der Haupttabelle von dem, was eine Schneeflocke prasselt ist sieht ein bisschen wie:

id | rent_start | rent_duration | rent_end  | customerID | carId 
    ----------------------------------------------------------------------------------- 
    203 | 2016-10-03 |  5  | 2016-11-07 | 16545 | 4543 
    125 | 2016-10-20 |  9  | 2016-10-28 | 54452 | 5465 
    405 | 2016-11-01 |  2  | 2016-01-02 | 43565 | 346 

Mein Ziel ist es, eine Abfrage zu erstellen, die

1) Eine gegebene erlaubt Zeitraum Bereich wie zum Beispiel: von 2016-10-03 bis 2016-11-03 2) Eine Anzahl von Tagen, zum Beispiel: 10

ermöglicht es mir, die Autos, die tatsächlich verfügbar sind für mindestens 10 CONSECUTIVE abrufen Tage zwischen dem 10. Oktober und dem 11. Oktober th. Eine Liste von IDs für diese Autos ist mehr als genug ... Ich weiß einfach nicht wirklich, wie man eine solche Abfrage einrichtet.

Wenn es helfen kann: Ich habe eine Liste aller Auto-IDs in einer anderen Tabelle.

Wie auch immer, danke!

Antwort

0

Ich denke, es ist viel einfacher, zu diesem Zweck mit der Verfügbarkeit statt der Vermietung zu arbeiten.

So:

select r.car_id, r.rent_end as avail_start, 
     (select min(r2.rent_start 
     from rentals r2 
     where r2.car_id = r.car_id and r2.rent_start > r.rent_start 
     ) as avail_end 
from rentals r; 

Dann für Ihre Anfrage, benötigen Sie mindestens 10 Tage. Sie können eine having Klausel oder Unterabfrage für diesen Zweck verwendet werden:

select r.* 
from (select r.car_id, r.rent_end as avail_start, 
      (select min(r2.rent_start 
       from rentals r2 
       where r2.car_id = r.car_id and r2.rent_start > r.rent_start 
      ) as avail_end 
     from rentals r 
    ) r 
where datediff(avail_end, avail_start) >= $days; 

Und schließlich müssen Sie für die Zeit während der Tage, um Sie an:

select r.* 
from (select r.car_id, r.rent_end as avail_start, 
      (select min(r2.rent_start 
       from rentals r2 
       where r2.car_id = r.car_id and r2.rent_start > r.rent_start 
      ) as avail_end 
     from rentals r 
    ) r 
where datediff(avail_end, avail_start) >= $days and 
     ((avail_end > $end and avail_start < $start) or 
     (avail_start <= $start and avail_end >= $start + interval 10 day) or 
     (avail_start > $start and avail_start + interval 10 day <= $end) 
    ); 

Diese behandelt die verschiedenen Bedingungen, bei denen die freie Zeitraum deckt den gesamten Bereich oder beginnt/endet während des Bereichs.

Zweifelsfälle in dieser Logik sind zweifelsfrei (ist ein Auto am gleichen Datum verfügbar, das es zurückgibt). Das sollte Ihnen einen soliden Ansatz zur Lösung des Problems geben.

Übrigens sollten Sie auch Autos einschließen, die noch nie gemietet wurden. Aber das ist mit den Tabellen, die Sie in der Frage beschreiben, nicht möglich.

+0

Funktioniert super gut, und ja das Problem, das Sie erwähnten (Zimmer ohne Buchungen) ist eigentlich eins. – DeadEnd

+0

Eine andere ist, dass es das erste verfügbare Datum als das Ende der ersten Vermietung zählt. Das heißt, wenn ein Auto nur einmal gemietet wurde oder nur einmal gemietet wird, gilt jedes vorherige Datum als nicht verfügbar. – DeadEnd