Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

Consulta compleja en reserva de fechas

Estas en el tema de Consulta compleja en reserva de fechas en el foro de Bases de Datos General en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 19/10/2017, 18:45
Avatar de ravalos7  
Fecha de Ingreso: diciembre-2005
Mensajes: 102
Antigüedad: 19 años
Puntos: 0
Exclamación Consulta compleja en reserva de fechas

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 original
  1. SELECT
  2.         propiedad.codigo_propiedad,
  3.         propiedad_reserva.START,
  4.         propiedad_reserva.END /*,propiedad_tipo.nombre as tipo,
  5.                 propiedad_categoria.nombre as categoria,
  6.                 regiones.region_ordinal,
  7.                 regiones.region_nombre,
  8.                 provincia.provincia_nombre as provincia,
  9.                 comunas.comuna_nombre as comuna,
  10.                 propiedad_reserva.start,
  11.                 propiedad_reserva.end*/
  12.  FROM propiedad
  13.       INNER JOIN propiedad_tipo ON propiedad.propiedad_tipo_id =
  14.        propiedad_tipo.id
  15.       LEFT OUTER JOIN propiedad_reserva ON propiedad.id =
  16.        propiedad_reserva.propiedad_id
  17.       INNER JOIN propiedad_categoria ON propiedad.categoria =
  18.        propiedad_categoria.id
  19.       INNER JOIN regiones ON propiedad.region = regiones.region_id
  20.       INNER JOIN provincia ON propiedad.provincia = provincia.provincia_id
  21.       INNER JOIN comunas ON propiedad.comuna = comunas.comuna_id
  22.  
  23.  
  24.  WHERE
  25.  
  26.  NOT EXISTS (SELECT * FROM propiedad_reserva WHERE propiedad_reserva.start>= '2017-10-3' AND propiedad_reserva.END <= '2017-10-7') AND
  27.  
  28.  
  29.    /* ( (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*/
  30.          
  31.        ((MONTH (propiedad_reserva.START) >= '10') AND
  32.        (YEAR (propiedad_reserva.START) = '2017')) AND
  33.        ((MONTH (propiedad_reserva.END) <= '10') AND
  34.        (YEAR (propiedad_reserva.END) = '2017'))
  35.        
  36.        /* NOT( propiedad_reserva.start >= '2017-10-3' AND propiedad_reserva.end <= '2017-10-7')   AND        
  37.  
  38.         NOT( propiedad_reserva.start >= '2017-10-3' AND propiedad_reserva.start <= '2017-10-7') AND
  39.  
  40.        NOT( propiedad_reserva.end <= '2017-10-7' AND propiedad_reserva.end >= '2017-10-3')
  41.    
  42.         AND (
  43.           (( MONTH(propiedad_reserva.start)>='10') AND ( YEAR(propiedad_reserva.start)='2017') ) AND
  44.                        
  45.           ( ( MONTH(propiedad_reserva.end)<='10') AND ( YEAR(propiedad_reserva.end)='2017') )
  46.     )
  47. */
  48.  GROUP BY propiedad.id
  49.  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

Última edición por gnzsoloyo; 20/10/2017 a las 09:59 Razón: Código MAL etiquetado.
  #2 (permalink)  
Antiguo 20/10/2017, 07:51
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Consulta compleja en reserva de fechas

empieza a debuggear tu codigo, seguro que con esta condicion no te muestra dicha propiedad?

Código SQL:
Ver original
  1. SELECT
  2.         propiedad.codigo_propiedad,
  3.         propiedad_reserva.START,
  4.         propiedad_reserva.END
  5.  
  6. /*,propiedad_tipo.nombre as tipo,
  7.                 propiedad_categoria.nombre as categoria,
  8.                 regiones.region_ordinal,
  9.                 regiones.region_nombre,
  10.                 provincia.provincia_nombre as provincia,
  11.                 comunas.comuna_nombre as comuna,
  12.                 propiedad_reserva.start,
  13.                 propiedad_reserva.end*/
  14.  FROM propiedad
  15.       INNER JOIN propiedad_tipo ON propiedad.propiedad_tipo_id =
  16.        propiedad_tipo.id
  17.       LEFT OUTER JOIN propiedad_reserva ON propiedad.id =
  18.        propiedad_reserva.propiedad_id
  19.       INNER JOIN propiedad_categoria ON propiedad.categoria =
  20.        propiedad_categoria.id
  21.       INNER JOIN regiones ON propiedad.region = regiones.region_id
  22.       INNER JOIN provincia ON propiedad.provincia = provincia.provincia_id
  23.       INNER JOIN comunas ON propiedad.comuna = comunas.comuna_id
  24.  
  25.  
  26.  WHERE
  27.  
  28.  NOT EXISTS (SELECT * FROM propiedad_reserva WHERE propiedad_reserva.start>= '2017-10-3' AND propiedad_reserva.END <= '2017-10-7')

Ahora estas haciendo un left outer en la tabla de propiedad reserva, usando el id_propiedad, si la propiedad tiene 2 valores en tu tabla va a aparecer estas 2 veces aunque en el where le pongas que no te tome la segunda, porque? bueno al poner el where le estas diciendo que quite la propiedad que tiene el rango, pero la otra no la quitas por eso sigue apareciendo.

Podrias hacer el left outer con esto:


Código SQL:
Ver original
  1. SELECT
  2.         propiedad.codigo_propiedad,
  3.         propiedad_reserva.START,
  4.         propiedad_reserva.END
  5.  
  6. /*,propiedad_tipo.nombre as tipo,
  7.                 propiedad_categoria.nombre as categoria,
  8.                 regiones.region_ordinal,
  9.                 regiones.region_nombre,
  10.                 provincia.provincia_nombre as provincia,
  11.                 comunas.comuna_nombre as comuna,
  12.                 propiedad_reserva.start,
  13.                 propiedad_reserva.end*/
  14.  FROM propiedad
  15.       INNER JOIN propiedad_tipo ON propiedad.propiedad_tipo_id =
  16.        propiedad_tipo.id
  17.       LEFT OUTER JOIN
  18. (SELECT id_propiedad, reserva_end, reserva_start FROM propiedad_reserva WHERE propiedad_reserva.start>= '2017-10-3' AND propiedad_reserva.END <= '2017-10-7')
  19. propiedad_reserva ON propiedad.id <>
  20.        propiedad_reserva.propiedad_id
  21.  
  22.  
  23.       INNER JOIN propiedad_categoria ON propiedad.categoria =
  24.        propiedad_categoria.id
  25.       INNER JOIN regiones ON propiedad.region = regiones.region_id
  26.       INNER JOIN provincia ON propiedad.provincia = provincia.provincia_id
  27.       INNER JOIN comunas ON propiedad.comuna = comunas.comuna_id

Aqui si encuentra el 157 en el rango de fechas, no lo va a incluir en el join, prueba y comenta
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Etiquetas: compleja, mysql, reservas
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:14.