sql >> Base de Datos >  >> RDS >> Mysql

Ayuda con la consulta SQL para encontrar la próxima fecha disponible para un sistema de reservas

Lo siguiente debería ponerte en marcha. es posible que desee ajustar mi muestra de la función "Current_Date()" para cualquiera que sea la fecha de inicio de su reserva y salir tantos días...

Esto utiliza variables en línea de MySQL en la consulta. La consulta interna es una simple preparación de una variable de reserva (@r) basada en alguna fecha de inicio ( current_date() ), y se une a la tabla de elementos. Al no hacer una cláusula de unión, de lo contrario tomaría una fecha para cada elemento. En mi escenario, solo estoy considerando salir 30 días, por lo que apliqué un límite de los primeros 30 artículos. No hay más base que darme suficientes registros para que no tenga que crear una tabla temporal de 30 registros (o la cantidad de días que desee). Esto crea una consulta con alias "JustDates" y tiene una sola columna "OpenDate". Esta es la base de los rangos de fechas para probar.

Esto ahora está unido a la tabla de artículos, pero ninguna condición crea un cartesiano para decir para cada fecha, comparar con cada artículo... según la cláusula WHERE, solo me preocupan los artículos que tienen SKU de "ABC123" y tienen 10 seriales. #s o 100. Esto ahora me daría un posible 300 o 3000 (10 artículos en serie a los 30 días, o 100 artículos en serie a los 30 días.

Ahora que tengo un "rango" de todos los números de serie individuales y los días posibles para verificar la disponibilidad, ahora puedo consultar el sistema de reservas. Por lo tanto, a través de una subselección, y NOT IN para un SKU coincidente determinado, un número de SERIE y la fecha POSIBLE que se encuentra en las reservas, solo quiero mantener aquellas en las que NO se encuentra la fecha de apertura dada. Simulé las estructuras de su tabla y puse un puñado de artículos, múltiples números de serie y rangos de fechas de reserva escalonadas y funciona muy bien...

Obviamente, aseguraría índices en sku/serial para el rendimiento. El único cambio adicional que podría hacer es excluir cualquier reserva en la que la fecha de finalización sea anterior a la fecha de inicio en cuestión para SU consulta y, de manera opcional, que no haya fecha de inicio> la ÚLTIMA fecha que está considerando. Si tiene un montón de reservas que abarcan años, ¿a quién le importa algo antiguo o algo en el futuro del rango de fechas en cuestión?

select  items.sku,
        items.serial_number,
        JustDates.OpenDate
    from 
        ( SELECT 
                 @r:= date_add(@r, interval 1 day ) OpenDate
            FROM 
                 (select @r := current_date()) vars,
                items limit 30 ) JustDates,
        items
    where 
            sku = "ABC123"
        and sku not in ( select sku from Reservations
                            where items.sku = reservations.sku
                              and items.serial_number = reservations.serial_number
                              and justDates.OpenDate >= reservations.start_date
                              and justDates.OpenDate <= reservations.end_date )
    order by 
       items.serial_number,
       justDates.OpenDate