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

MySQL trova il primo fine settimana disponibile

Penso che agli altri manchi la domanda... Pensano che il tuo tavolo possa già essere POPOLATO con tutti i fine settimana e qualche stato da aprire o meno... La mia ipotesi è che il tuo tavolo HA un record solo SE è riservato... quindi devi trovare record che NON ESISTONO NIENTE... sulla base di alcune date automatiche di Cerca...

Questa è una modifica a un altro post che ho fatto qui

Sebbene non abbia modificato il contesto della query, ho inserito solo le colonne associate alla TUA tabella. Capisco che stai andando contro un solo tavolo da sala e lo sono anch'io (in realtà). Tuttavia, per comprendere l'alias "JustDates", questa PRE-QUERY INTERNA sta creando una tabella popolata dinamicamente di TUTTE LE DATE eseguendo un join cartesiano con QUALSIASI altra tabella.. in questo caso, la tabella delle prenotazioni "Sede" (non l'ho fatto t vedere il riferimento al nome della tabella effettivo in modo esplicito, quindi dovrai cambiarlo). Quindi, questo in sostanza crea una tabella di tutte le date a partire da qualunque sia "oggi" e va avanti per 30 giorni (tramite limite), ma potrebbe essere 40, 50, 300 o quante ne occorrono.. fornito "YourVenueTable" ha almeno tanti record quanti sono i giorni per i quali desideri eseguire il test. (stesso chiarimento nel post da cui è stato derivato). Questo set di risultati che esce 30, 40 o comunque molti giorni è prefiltrato SOLO per il giorno della settimana specificato di 1-domenica o 7-sabato... Quindi dovrebbe restituire un set di risultati di solo 23 aprile, 24 aprile, aprile 30, 1 maggio, 7 maggio, 8 maggio, 14 maggio, 15 maggio, 21 maggio, 28 maggio, ecc.

Quindi ORA hai un set di risultati creato dinamicamente di tutti i giorni possibili che stai considerando di andare avanti. Ora, questo viene unito alla tabella delle prenotazioni della sede effettiva e viene filtrato per restituire SOLO quelle DATE in cui NON è stato trovato per l'id_venue di cui sei preoccupato. Nel tuo esempio di dati troverebbe una corrispondenza il 23 e 24 aprile e NON restituirebbe quei record. Lo stesso con il 30 aprile... Tuttavia, scoprirà che il record nell'elenco delle prequalificazioni che include il 1 maggio NON troverà la corrispondenza della data nella tabella delle sedi e quindi la includerà come stai anticipando... Continuerà quindi a saltare 7 e 8 maggio, poi ritorno 14, 15, 21, 28 maggio, ecc...

select JustDates.OpenDate
  from 
      ( select
         @r:= date_add( @r, interval 1 day ) OpenDate
      from
         ( select @r := current_date() ) vars,
         Venue 
      LIMIT 30 ) JustDates
   where
      DAYOFWEEK( JustDates.OpenDate ) IN ( 1, 7 )
      AND JustDates.OpenDate NOT IN
          ( select Venue.date
                from Venue
                where Venue.id_venue = IDYouAreInterestedIn
                  and Venue.Date = JustDates.OpenDate )
    order by 
       JustDates.OpenDate

Nota, e per le altre registrazioni di prenotazioni, la query per le date di disponibilità della data di prenotazione che supera il limite di 30 può essere QUALSIASI tabella nel sistema purché abbia ALMENO tutti i giorni che desideri attendere per le prenotazioni.. . Se desideri tutta la disponibilità per un anno a venire, vorresti 365 record nella tabella utilizzati per un risultato cartesiano per ottenere il ciclo @r attraverso i record di "data" creati dinamicamente.