Amigos,
Ya me estoy volviendo loco!.
Para mi trabajo estoy haciendo un sistema de reservas , en el cual se hace una búsqueda de propiedades disponibles (sin reservas) en un rango de fechas. La idea es que al hacer dicha búsqueda, si alguna propiedad tiene el rango ocupado sea excluída de los resultados.
En la actualidad, al búscar por ejemplo entre el 3 y el 7 de octubre, pues esta la propiedad de ejemplo n° 157 que tiene ese rango ocupado, me arroja precisamente esa propiedad en vez de excluirla porque la encuentra en otro rango distinto en condiciones que debería dejarla afuera.
las tablas principales que estoy trabajando son propiedades y propiedades_reserva
Con respecto a la consulta, he probado tantas variantes que ya no se que mas hacer. La idea como les decía que si al buscar en un rango la propiedad tiene ese rango ocupado total o parcialmente quede excluida de los resultados aun cuando en una fecha posterior o anterior este disponible.
Mi consulta actual (llena de comentarios con cosas que he ido sacando y poniendo en medio de tantas pruebas) es:
Código SQL:
Ver originalSELECT
propiedad.codigo_propiedad,
propiedad_reserva.START,
propiedad_reserva.END /*,propiedad_tipo.nombre as tipo,
propiedad_categoria.nombre as categoria,
regiones.region_ordinal,
regiones.region_nombre,
provincia.provincia_nombre as provincia,
comunas.comuna_nombre as comuna,
propiedad_reserva.start,
propiedad_reserva.end*/
FROM propiedad
INNER JOIN propiedad_tipo ON propiedad.propiedad_tipo_id =
propiedad_tipo.id
LEFT OUTER JOIN propiedad_reserva ON propiedad.id =
propiedad_reserva.propiedad_id
INNER JOIN propiedad_categoria ON propiedad.categoria =
propiedad_categoria.id
INNER JOIN regiones ON propiedad.region = regiones.region_id
INNER JOIN provincia ON propiedad.provincia = provincia.provincia_id
INNER JOIN comunas ON propiedad.comuna = comunas.comuna_id
WHERE
NOT EXISTS (SELECT * FROM propiedad_reserva WHERE propiedad_reserva.start>= '2017-10-3' AND propiedad_reserva.END <= '2017-10-7') AND
/* ( (propiedad_reserva.start NOT BETWEEN '2017-10-3' AND '2017-10-7') OR (propiedad_reserva.end NOT BETWEEN '2017-10-3' AND '2017-10-7') ) AND*/
((MONTH (propiedad_reserva.START) >= '10') AND
(YEAR (propiedad_reserva.START) = '2017')) AND
((MONTH (propiedad_reserva.END) <= '10') AND
(YEAR (propiedad_reserva.END) = '2017'))
/* NOT( propiedad_reserva.start >= '2017-10-3' AND propiedad_reserva.end <= '2017-10-7') AND
NOT( propiedad_reserva.start >= '2017-10-3' AND propiedad_reserva.start <= '2017-10-7') AND
NOT( propiedad_reserva.end <= '2017-10-7' AND propiedad_reserva.end >= '2017-10-3')
AND (
(( MONTH(propiedad_reserva.start)>='10') AND ( YEAR(propiedad_reserva.start)='2017') ) AND
( ( MONTH(propiedad_reserva.end)<='10') AND ( YEAR(propiedad_reserva.end)='2017') )
)
*/
GROUP BY propiedad.id
ORDER BY propiedad.codigo_propiedad;
Al ejecutar la consulta anterior en el estado actual, me devuelve el siguiente resultado. Lamentablemente me devuelve la pu.. propiedad numero 157 que es precisamente la que está registrada en la tabla reservas en el rango entre el 3/oct y el 7/oct y que no debería aparecer porque tiene ocupado el rango pero la muestra porque a posterior del rango existe en la tabla, cuando la lógica que toda propiedad que exista en la tabla reservas en un rango buscado NO SE MUESTRE de ninguna forma.
Por favor amigos les ruego su ayuda urgente, es para mi trabajo y ya no se que cosa mas hacer!!!
GRAACIAS A TODOS