Ver Mensaje Individual
  #1 (permalink)  
Antiguo 02/12/2010, 16:27
Avatar de destor77
destor77
 
Fecha de Ingreso: noviembre-2004
Ubicación: Gálvez, Santa Fe, Argentina
Mensajes: 2.654
Antigüedad: 19 años, 5 meses
Puntos: 43
consultar disponibilidad de reservas

Hola,
estoy haciendo un sistema para alquiler de inmuebles, en el cual tengo 2 tablas
una para los inmuebles y otra para las reservas que tiene los siguientes campos
res_id
res_inm_id
res_start_date
res_start_date
estado (que pueden ser 0=reservado, 1=bloqueado, 2=bajo consulta)

Bien ahora supongamos que quiero buscar todos los inmuebles del tipo 1 (id: 89,78,75,66) que no este reservados ni bloqueados entre el 02-12-2010 y el 08-12-2010 y en la tabla reserva tengo los inmuebles:
id 89 con una reserva del 31-11-2010 al 01-12-2010 estado 0
id 89 con una reserva del 03-12-1010 al 06-12-2010 estado 1
id 89 con una reserva del 08-12-2010 al 11-12-2010 estado 0
id 78 con una reserva del 03-12-2010 al 07-12-2010 estado 0
id 66 con una reserva del 03-12-2010 al 07-12-2010 estado 2

yo intento usar la siguiente query:
Código MySQL:
Ver original
  1. SELECT inm.*,p.name AS pais, t.tipo_nombre_es as tipo, s.name AS estado, c.name AS ciudad
  2. FROM mvr_inmuebles AS inm
  3. LEFT JOIN locations_countries AS p ON p.id=inm.inm_country
  4. LEFT JOIN locations_states AS s ON s.id=inm.inm_state
  5. LEFT JOIN locations_cities AS c ON c.id=inm.inm_city
  6. LEFT JOIN mvr_reservas AS r ON r.res_inm_id=inm.inm_id
  7. LEFT JOIN mvr_tipo AS t ON t.tipo_id=inm.inm_type
  8. AND inm_type='1'
  9. AND (inm.inm_id IN ( SELECT res_inm_id FROM mvr_reservas WHERE ( res_start_date BETWEEN '2010-12-02' AND '2010-12-08')
  10. OR (res_end_date BETWEEN '2010-12-02' AND '2010-12-08')
  11. OR (res_start_date < '2010-12-02' AND res_end_date > '2010-12-08')
  12. AND estado = 2 )
  13. OR inm.inm_id NOT IN ( SELECT res_inm_id FROM mvr_reservas WHERE ( res_start_date BETWEEN '2010-12-02' AND '2010-12-08')
  14.  OR (res_end_date BETWEEN '2010-12-02' AND '2010-12-08')
  15. OR (res_start_date < '2010-12-02' AND res_end_date > '2010-12-08') ) )
  16. AND inm_larga!='1'
  17. GROUP BY inm_id
  18. ORDER BY inm_price ASC
  19. LIMIT 0,6
esa query no me esta devolviendo correctamente los datos, ya que me devuelve los inmuebles 89 y 78 en vez de los inmuebles 66 y 75. Por lo que he notado esto me lo hace porque en el rango de fecha que le paso para buscar hay algunos dias por ejemplo 2 que estan "libres" pero el siguiente día no, y en vez de no devolverlo porque estaría reservado me la trae igual.
Ya nose como poder solucionarlo.
Espero que me puedan dar una mano.
Desde ya muchas gracias