2016-07-08 2 views
2

Ich habe ein zwei Tabellen:Hotelbuchung SQL-Abfrage nicht funktioniert

Zimmer

id 
category_id 
name 
description 
image 
price 
arrival_date 
depature_date 
status 

Buchung

id 
name 
email 
mobile 
category_id 
room_id 
arrival 
departure 

Q1. Wie kann ich prüfen, ob ein Zimmer für Kunden verfügbar ist oder nicht?
Q2. Ich möchte den Raum Liste anzuzeigen, die für die Benutzereingabe Datum

ich diese Abfrage leer bin mit und es gibt mir error #1241 - Operand should contain 1 column(s)

SELECT * FROM room WHERE status = '1' AND id NOT IN 
    (SELECT * FROM booking 
    WHERE arrival='$arrival' 
    OR (arrival BETWEEN '$arrival' AND '$departure')) 

SELECT * FROM room WHERE status = '1' AND id NOT IN 
    (SELECT * FROM booking WHERE arrival='2/08/2013' 
    OR (arrival BETWEEN '2/08/2013' AND '22/08/2013')) 
+0

Ihre Unterabfrage gibt mehrere Ergebnisse für eine WHERE-Klausel zurück. Deshalb bekommen Sie diesen Fehler. Obwohl ich Ihre Unterabfrage lese, bin ich mir nicht sicher warum. Welches DBMS benutzt du? – Takarii

+0

Ich verwende WAMP MYSQL Datenbank – Harshit

Antwort

1

Um auf Ihre Fragen:

Q1. Wie kann ich überprüfen, Raum zur Verfügung steht oder nicht für Kunden

Ich nehme an, ein Zimmer ohne Reservierung für Kunden zur Verfügung steht, so versuchen Sie dies:

SELECT * 
FROM room r 
WHERE NOT EXISTS(
    SELECT 'booking' 
    FROM booking b 
    WHERE b.room_id = r.id 
    AND (b.arrival BETWEEN '$arrival' AND '$departure') 
) 

Q2. Ich möchte Tsd Raum Liste anzuzeigen, die für die Benutzereingabe Datum

Die Abfrage ist die gleiche leer ist, wenn keine Buchung in diesem Intervall existiert der Raum leer ist (so buchbar ist)

3

Das Hauptproblem ist, dass auf der inneren Abfrage, Sie bekommen auch viele Spalten als Ergebnisse.

Versuchen:

SELECT * FROM room WHERE status = '1' AND id NOT IN 
    (SELECT room_id FROM booking 
    WHERE arrival='$arrival' 
    OR (arrival BETWEEN '$arrival' AND '$departure')) 

SELECT * FROM room WHERE status = '1' AND id NOT IN 
    (SELECT room_id FROM booking 
    WHERE arrival='2/08/2013' 
    OR (arrival BETWEEN '2/08/2013' AND '22/08/2013')) 
+0

Wie würde die Änderung des Spaltennamens einen Unterschied machen? – Takarii

+2

Ich denke, ich verstehe de Frage nicht. Ersetzen Sie einfach das '*' der inneren Abfrage durch "room_id". Wenn Sie den Spaltennamen ändern müssen, müssten Sie auch das SQL ändern. –

+0

Sorry, ich war mit einem Daft Moment eine neue Kategorie Tabelle hinzufügen – Takarii