2012-01-18 18 views
6

Quiero construir un sistema de reserva de hotel. Para este sistema; base de datos también se utiliza aquí para allá otro programa ... pero tengo un problema: antes de la reserva quiero ver qué número de habitaciones tipo están disponibles para mi para mi reserva ..Sql Query System System Hotel Query?

Mi mesa crear consultas 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 probar esto, pero no trabajar

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)) 

gracias ... ahora

+0

'¿EN tip.tip_id' debe ser' DONDE EN tip.tip_id ' –

+2

+1 para incluir DDL. –

+0

gracias Florin Ghita y Mark Bannister, lo intenté pero el resultado no es cierto, tampoco puedo mostrar el número de habitaciones. Creo que mi consulta es incorrecta ... – Mehmet

Respuesta

2

Suponiendo que las habitaciones disponibles son aquellos que no están ya reservados en cualquier momento durante el período de consulta, y que rezervasyon_gt y rezervasyon_ct son el inicio reserva y fechas de finalización, respectivamente, tratan:

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

Gracias Marque la consulta no está funcionando correctamente. Sigue la estructura de mi base de datos y la consulta SQL de datos. Gracias de antemano ... [Sql Create Query] (http://verigrup.net/oteldb.txt) Convertí Inglés – Mehmet

+1

@Mehmet: Utilizando los datos de prueba, intenté ejecutar mi consulta localmente y me di cuenta de que debería haber estado seleccionando 'count (oda.oda_tip_id)', not 'count (*)'. He modificado mi consulta en consecuencia: la consulta modificada parece funcionar correctamente con los datos de prueba. –

+0

Gracias Mark, probé la consulta de nuevo, pero también mostró las habitaciones reservadas en la fecha del tiempo de reserva que se ha pedido. Le envío el enlace del cuadro sql en inglés [sql table] (http://verigrup.net/hotel.txt). por ejemplo hay 5 habitaciones ocupadas entre 2012,01,03 y 2012.01.22. no debe mostrar la habitación ocupada en ese "tipo" en la lista "tipo". es decir, si las 5 de las 8 habitaciones están ocupadas en "type_id" = 1, debe tener en cuenta 3 habitaciones que tienen "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 Gracias, error en la consulta. :/ 1 Tiene un error en la sintaxis SQL; revise el manual que corresponde a su versión del servidor MySQL para la sintaxis correcta para usar cerca de '(if (Rooms.oda_id = BookedRooms.rezervasyon_oda_id, 0, 1)) como AvailableCount,' en la línea 3 Query1.qry 3 7 – Mehmet

+0

@Mehmet, cambie de IF (condición, respuesta verdadera, respuesta falsa) a una condición de Caso/cuando. – DRapp

+0

:/1 Tiene un error en su sintaxis SQL; verifique el manual que corresponde a su versión del servidor MySQL para la sintaxis correcta para usar cerca de 'sum (case when Rooms.oda_id = BookedRooms.rezervasyon_oda_id th' en la línea 1 Query1.qry 1 37 – Mehmet