MySQL - ¿Cómo puedo negar una consulta?

 
Vista:

¿Cómo puedo negar una consulta?

Publicado por Oscar (1 intervención) el 16/08/2007 23:02:35
Hola a todos, os explico mi problema:

Resulta que tengo una base de datos relacional de reservas de hotel estructurada de la siguiente forma:

Hay una tabla HOTELES donde guardo los datos de cada hotel. De todas las habitaciones que tiene cada hotel, sólo trabajo con un número reducido de ellas, digamos que nos las guardan para que las reservemos nosotros.

Por eso hay otra tabla HABITACIONES que guarda todas las habitaciones de todos los hoteles con los que trabajamos, con los siguientes campos: id del hotel al que pertenece la habitación, número de habitación, y tipo de habitación.

Luego, para registrar las fechas en las que cada habitación está ocupada hay una tabla PERIODOS con los campos: id del hotel, número de la habitación, fecha de inicio de ocupación de la habitación, y fecha de fin.

Y lo que yo quiero es: dado un periodo de tiempo y un hotel, tener una consulta que me diga si ese hotel tiene alguna habitación libre en esas fechas o están todas ocupadas.

La consulta con la que más me he acercado a la solución es la siguiente:

SELECT número de habitación FROM periodos
WHERE [[--la habitación está ocupada en la fecha dada--]]
AND id del hotel=[[--id del hotel que quiero--]];

Esto me da los números de habitación de las habitaciones que están ocupadas en las fechas que le digo. Lo único que me faltaría sería que me negara esa consulta y me devolviera DE TODAS LAS HABITACIONES DEL HOTEL SELECCIONADO, JUSTO LAS QUE NO CUMPLEN LA CONSULTA, y de esta manera, si el resultado es cero, es que el hotel está completo.

He probado a meter todo lo que hay después del WHERE dentro de un NOT, pero no resulta bien, por lo que os cuento a continuación:
Pongamos que tenemos una habitación que está ocupada en el rango de fechas que yo busco (pongamos del 2 al 5 de mayo), y además está ocupada en otro periodo que no coincide con esas fechas, entonces tendríamos estas entradas en la BD:
periodo 1:
id de hotel=1||numero de hab=200||fecha ini=2 de mayo||fecha fin=3 de mayo||
periodo 2:
id de hotel=1||numero de hab=200||fecha ini=3 de junio||fecha fin=5 de junio||

Con la consulta que os he puesto más arriba, me diría que la habitación 200 está ocupada del 2 al 5 de mayo, lo cual es verdad. Pero si le hiciera un NOT al WHERE de esa consulta, me diría que la habitación 200 NO ESTÁ OCUPADA del 2 al 5 de mayo, porque ENCUENTRA UN PERIODO (del 3 al 5 de junio) que NO COINCIDE con la fecha dada, y me devuelve su número de habitación, con lo cual no me sirve.

Ya sé que el problema es un poco complejo, así que os pido ayuda porque yo estoy perdido ¿Cómo puedo negar esa consulta de una manera que me funcione como yo quiero? ¿se os ocurre alguna otra forma de solucionar el problema, con una consulta distinta?

Estoy desesperado. Gracias por el esfuerzo, a ver si vosotros lo sacáis. Si necesitáis que os escriba los create table y la consulta sin pseudocódigo, no hay problema.

Un saludo.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder