Mysql
 sql >> Database >  >> RDS >> Mysql

Aiuto con query SQL per trovare la prossima data disponibile per un sistema di prenotazione

Quanto segue dovrebbe farti andare avanti. potresti voler modificare il mio campione della funzione "Current_Date()" per qualunque sia la data di inizio della tua prenotazione e di uscire così tanti giorni....

Questo utilizza le variabili inline MySQL nella query. La query interna è una semplice preparazione di una variabile di prenotazione (@r) basata su una data di inizio ( current_date() ) e si unisce alla tabella degli elementi. Non facendo alcuna clausola di unione, altrimenti prenderebbe una data per ogni articolo. Nel mio scenario, sto pensando di uscire solo 30 giorni, quindi ho applicato un limite ai primi 30 articoli. Nessuna base diversa da quella di darmi abbastanza record in modo da non dover creare una tabella temporanea di 30 record (o per quanti giorni vuoi uscire). Questo crea una query con alias "JustDates" e ha una singola colonna "OpenDate". Questa è la base degli intervalli di date da testare.

Questo è ora unito alla tabella degli articoli, ma nessuna condizione crea un cartesiano da dire per ogni data, confronta con ogni articolo... secondo la clausola WHERE, mi interessa solo di articoli con SKU di "ABC123" con 10 seriali #s o 100. Questo ora mi darebbe un possibile 300 o 3000 (10 articoli di serie a 30 giorni o 100 articoli di serie a 30 giorni.

Ora che ho una "gamma" di tutti i numeri di serie individuali e i giorni possibili per verificare la disponibilità, ora posso interrogare il sistema di prenotazione. Quindi, tramite una sottoselezione e NON IN per un determinato SKU corrispondente, SERIAL # e la POSSIBILE Data trovata nelle prenotazioni, voglio solo mantenere quelle in cui NON si trova l'OpenDate specificato. Ho simulato le strutture della tua tabella e inserito una manciata di articoli, più numeri di serie e intervalli di date di prenotazione scaglionati e funziona alla grande...

Ovviamente, garantirei gli indici su sku / serial per le prestazioni. L'unica modifica aggiuntiva che potrei apportare è quando eseguo query rispetto alle prenotazioni, per escludere eventuali prenotazioni in cui la data di fine è precedente alla data di inizio in questione per la TUA query e, facoltativamente, nessuna Data di inizio> l'ULTIMA data che stai considerando. Se hai un sacco di riserve che coprono anni, chi se ne frega di qualcosa di antico o qualcosa di molto futuro dall'intervallo di date in questione.

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