2012-01-18 8 views
6

Voglio costruire un sistema di prenotazione alberghiera. Per questo sistema; database viene utilizzato anche fro un altro programma ... ma ho problema: prima della prenotazione voglio vedere quale numero di camere tipo sono disponibili per la mia per la mia prenotazione ..Sistema di prenotazione Hotel Sql Query?

Il mio tavolo creare querys sql

CREATE TABLE oteldb.oda (
oda_id INT (11) NOT NULL auto_increment, 
oda_tip_id INT (11) DEFAULT NULL, 
oda_adi VARCHAR (20) DEFAULT NULL, 
PRIMARY KEY (oda_id) 
) 
ENGINE = MyISAM 
AUTO_INCREMENT = 1 
CHARACTER SET utf8 
COLLATE utf8_general_ci; 

CREATE TABLE oteldb.tip (
tip_id INT (11) NOT NULL auto_increment, 
tip_adi VARCHAR (20) DEFAULT NULL, 
PRIMARY KEY (tip_id) 
) 
ENGINE = MyISAM 
AUTO_INCREMENT = 1 
CHARACTER SET utf8 
COLLATE utf8_general_ci 
ROW_FORMAT = FIXED; 

CREATE TABLE oteldb.rezervasyon (
rezervasyon_id INT (11) NOT NULL auto_increment, 
rezervasyon_gt DATE DEFAULT NULL, 
rezervasyon_ct DATE DEFAULT NULL, 
rezervasyon_oda_id INT (11) DEFAULT NULL, 
PRIMARY KEY (rezervasyon_id) 
) 
ENGINE = MyISAM 
AUTO_INCREMENT = 1 
CHARACTER SET utf8 
COLLATE utf8_general_ci; 

i provare questo ma non funziona

SELECT 
* 
FROM 
oteldb.tip 
WHERE 
IN tip.tip_id 
(SELECT 
oteldb.oda.oda_tip_id 
FROM 
oteldb.oda 
WHERE 
IN oda.oda_id note 

(SELECT 
oteldb.rezervasyon.rezervasyon_oda_id 
FROM 
oteldb.rezervasyon 
WHERE 
"2012-01-03" BETWEEN AND rezervasyon_ct rezervasyon_gt 
AND "2012-01-22" AND BETWEEN rezervasyon_gt rezervasyon_ct)) 

grazie ora ...

+0

'DOVE IN tip.tip_id' dovrebbe essere' DOVE IN tip.tip_id ' –

+2

+1 per includere DDL. –

+0

grazie a Florin Ghita e Mark Bannister, ho provato ma il risultato non è vero, inoltre non è possibile visualizzare il numero di stanze. i tihnk la mia query è errata ... – Mehmet

risposta

2

Supponendo che le camere disponibili sono quelli che non sono già riservati in qualsiasi momento durante il periodo di query, e che rezervasyon_gt e rezervasyon_ct sono il date di fine rispettivamente prenotazione iniziale e, provare:

select t.tip_adi, count(oda.oda_tip_id) 
from oteldb.tip t 
left join (select oda_tip_id 
      from oteldb.oda o 
      where not exists 
       (select null 
       from oteldb.rezervasyon r 
       where r.rezervasyon_oda_id = o.oda_id and 
         r.rezervasyon_gt <= '2012-01-22' and 
         '2012-01-03' <= r.rezervasyon_ct) 
      ) oda on oda.oda_tip_id = t.tip_id 
group by t.tip_adi 
+0

Grazie Mark la query non funziona correttamente. Segue la mia struttura di database e la query sql di dati. Grazie in anticipo .. [Sql Create Query] (http://verigrup.net/oteldb.txt) Ho convertito in inglese – Mehmet

+1

@Mehmet: utilizzando i dati di test, ho provato a eseguire la query in locale e mi sono reso conto che avrebbe dovuto selezionare 'count (oda.oda_tip_id)', non 'count (*)'. Ho modificato di conseguenza la mia domanda: la query modificata sembra funzionare correttamente con i dati di test. –

+0

Grazie Mark, ho provato di nuovo la query, ma ha anche mostrato le camere riservate nella data del tempo di prenotazione che è stato chiesto. Ti sto inviando il link di sql chart in inglese [sql table] (http://verigrup.net/hotel.txt). ad esempio ci sono 5 stanze occupate tra 2012,01,03 e 2012.01,22. non dovrebbe mostrare la stanza occupata in quel "tipo" nella lista "tipo". cioè, se il 5 delle 8 stanze è occupato in "type_id" = 1, è necessario considerare 3 stanze che hanno "type_id" = 1. – Mehmet

0
select 
     RoomType.tip_adi, 
     sum(if(Rooms.oda_id = BookedRooms.rezervasyon_oda_id, 0, 1) as AvailableCount 
    from 
     oteldb.oda Rooms 

     LEFT JOIN (select distinct 
          res.rezervasyon_oda_id 
         from 
          oteldb.rezervasyo res 
         where 
           res.rezervasyon_gt between '2012-01-22' and '2012-01-03' 
          OR res.rezervasyon_ct between '2012-01-22' and '2012-01-03' 
        ) BookedRooms 
      on Rooms.oda_id = BookedRooms.rezervasyon_oda_id 

     JOIN oteldb.tip RoomType 
      on Rooms.oda_tip_id = RoomType.tip_id 
+0

DRapp Grazie, errore di battitura nella query. :/ 1 Si ha un errore nella sintassi SQL; controlla il manuale corrispondente alla versione del tuo server MySQL per la sintassi corretta da usare vicino a '(if (Rooms.oda_id = BookedRooms.rezervasyon_oda_id, 0, 1)) come AvailableCount,' alla riga 3 Query1.qry 3 7 – Mehmet

+0

@Mehmet, cambiare da IF (condizione, risposta vera, risposta falsa) a una condizione caso/quando. – DRapp

+0

:/1 Si ha un errore nella sintassi SQL; controlla il manuale che corrisponde alla tua versione del server MySQL per la sintassi corretta da usare vicino alla somma (caso quando Rooms.oda_id = BookedRooms.rezervasyon_oda_id th 'alla riga 1 Query1.qry 1 37 – Mehmet