2017-11-03 5 views
1

Ich habe zwei Tabellen wie dieseMySQL LEFT JOIN mit dem Zustand

Zimmer

id | number 
1 | 111 
2 | 112 

occupied_rooms

id | check_in | check_out | room_id 
1 | 2017-10-01 | 2017-10-04 | 1 

Ich möchte, dass alle nicht belegten Zimmer bekommen nach Datum check_in und check_out dafür habe ich versucht

select r.id 
    , r.number 
    from rooms r 
    left join occupied_rooms o 
    on r.id = o.room_id 
where (o.check_in not between "2017-10-05" and "2017-10-08") 
or (o.check_in >= "2017-10-05" and o.check_out <= "2017-10-08")) 

aber diese Abfrage gibt mir das Ergebnis wie folgt. was falsch ist.

id | number 
1 | 111 

Was ist falsch an dieser Abfrage? Vielen Dank für Ihre jede mögliche Hilfe und Anregungen

+0

Was ist der Standardwert von check_in, check_out? ist das null? –

Antwort

1

Gerade die beiden Tabellen auf der Join-Bedingung, dass die id Spiele und der Bereich des geplanten Aufenthalts mit dem Bereich überlappen in der occupied_rooms Tabelle.

SELECT r.* 
FROM rooms r 
LEFT JOIN occupied_rooms t 
    ON r.id = t.id AND 
     ('2017-10-02' <= t.check_out AND '2017-10-03' >= t.check_in) 
WHERE 
    t.id IS NULL; -- NULL value indicates the room did not overlap 
        -- with any existing reservations 

Sie können auch diese great reference question überprüfen, wie mit überlappenden Bereiche in SQL-Abfragen beschäftigen. Es macht das Problem, dem Sie gegenüberstehen, viel einfacher.

Demo

+0

danke ich habe "is null" hinzugefügt und es hat wie erwartet funktioniert, wenn die Abfrage von PHP-Skript ausgelöst wird, aber es gibt immer noch zwei Ergebnisse, wenn Abfrage in phpmyadmin ausgeführt wird, sollte es nur ein Ergebnis geben -> wählen Sie rooms.number \t von ' Räume 'Left join' besetzte_Räume' auf 'rooms'.id' =' besetzte_Räume'.Room_ID' \t wo ('besetzte_Räume'.Check_in' nicht zwischen" 2017-10-02 "und" 2017-10-08 "or (' besetzte_Räume'.check_in'> = "2017-10-02" und 'besetzte_Räume'.check_out' <=" 2017-10-08 ")) oder' besetzte_Räume'.''id' ist null – sanu

+0

Edit meine Demo, aktualisiere sie und füge den Link hier ein. Ich schätze deine Daten sind das Problem. –

0

Ihre Daten in Tabelle occupied_rooms erfüllt die erste Bedingung in "where";

check in Datum (2017.10.01) nicht zwischen „2017.10.05“ und „2017.10.08“ und Ihrem wooder ist.

Somit ist das Ergebnis diese Daten enthalten.

Können Sie uns sagen, welche Ausgabe Sie erwarten?

+0

Überlappende Bereiche sind ein bisschen viel komplexer als dies, q.v. hier: https://stackoverflow.com/questions/325933/determine-wether-two-date-range-overlap –