2017-04-08 6 views
0

Ich versuche, eine Abfrage zu erstellen, die verfügbaren Hotels zwischen Check-in und Check-out-Daten zeigt. Auch wenn ich für bestimmte Zimmer reserviere, setze ich ihre Buchungsspalte auf 1. Das heißt, wenn das Checkout-Datum im wirklichen Leben kommt, wird eine Triggerfunktion die gebuchte Spalte als 0 setzen.Mysql Abfrage Suche nach Daten

Wenn alle Räume von a Hotel gebucht (gebucht = 1) und Check-in-Checkout-Daten dieser Zimmer sind bestimmte Datum (Check-in-Checkout-Eingänge), dann nicht das Hotel in der Liste. Meine Abfrage zeigt nicht das gewünschte Ergebnis an.

Abfrage: Eingaben: Land (Staat), Ein- und Auschecken.

SELECT DISTINCT a.* FROM accommodation a INNER JOIN cb_states s ON a.state = s.id 
INNER JOIN accommodation_rooms ar ON a.id = ar.accommodation 
WHERE state = 1 AND a.id NOT IN 
(
    SELECT 1 FROM booking b 
    WHERE 
    (
     (b.arrival_date BETWEEN '2017-11-16' AND '2018-03-16') 
     OR 
     (b.departure_date BETWEEN '2017-11-16' AND '2018-03-16') 
    ) 
) 

Wenn ich die Abfrage ausführen, zeigt es immer alle Hotels, egal Daten. Wenn ich schreibe ... WHERE ar.booked = 0 AND state = 1 AND a.id NOT IN..., dann zeigt es nicht Unterkunft ID 13, aber es zeigt auch nicht, wenn ich Daten ändern.

Unterkunft Tabelle: table 1

accommodation_rooms Tabelle: table 2

Buchungs Tabelle: table 3

booked_rooms Tabelle: (hat Fremdschlüssel mit Buchungs Tabelle) table 4

Antwort

1

Sie haben mehrere Probleme mit Ihrer Abfrage:

  1. Die NOT IN Liste hat SELECT 1. Das gibt der Liste NOT IN keine große Vielfalt.
  2. Ihre Logik für Überlappungen ist falsch.
  3. Ich denke, dass Sie Unterkunft Zimmer zu gebuchten Zimmer verbinden müssen.

So:

SELECT DISTINCT a.* 
FROM accommodation a INNER JOIN 
    cb_states s 
    ON a.state = s.id INNER JOIN 
    accommodation_rooms ar 
    ON a.id = ar.accommodation 
WHERE s.state = 1 AND 
     a.id NOT IN (SELECT br.accommodation_room 
        FROM booking b JOIN 
         booked_room br 
         ON b.?? = br.?? 
        WHERE b.arrival_date <= '2018-03-16' AND 
         b.departure_date >= '2017-11-16' 
       ); 
+0

Was könnte die beste Logik für meine Situation sein? –

+0

@MalenaT. . . Dies hat die Logik behoben. Das '<=' anstelle von 'between' findet * any * überlappt sich. –

+0

Ich sehe. Danke, 'b. ?? = br. ?? 'hier schrieb ich' b.id = br.booking' und es zeigt immer noch ein falsches Ergebnis. Außerdem verband ich Unterkunftszimmer mit gebuchten Zimmern in Unterabfrage '..... JOIN booked_rooms br ON bid = br.booking JOIN accommodation_rooms aar ON br.room = aar.id', es zeigt wieder ein falsches Ergebnis. –