Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL encontra o primeiro fim de semana disponível


Acho que os outros estão perdendo a pergunta... Acham que sua mesa já pode estar POPULADA com todos os finais de semana e algum status para abrir ou não... Meu palpite é que sua mesa só TEM registro SE estiver reservada... assim você precisa encontrar registros que NÃO EXISTEM... com base em algumas datas automatizadas de busca...

Esta é uma modificação de outra postagem que fiz aqui

Apesar de não ter alterado o contexto da consulta, coloquei apenas as colunas associadas à SUA tabela. Eu entendo que você só está indo contra uma única mesa e eu também (na verdade). No entanto, para entender o alias "JustDates", esta INNER PRE-QUERY está criando uma tabela preenchida dinamicamente de TODAS AS DATAS fazendo uma junção cartesiana contra QUALQUER outra tabela. t veja sua referência de nome de tabela real explicitamente, então você terá que mudar isso). Então, em essência, isso cria uma tabela de todas as datas a partir de qualquer "hoje" e avança por 30 dias (via limite), mas pode ser 40, 50, 300 ou quantas você precisar. tem pelo menos tantos registros quantos dias você deseja testar. (mesmo esclarecimento no post foi derivado). Este conjunto de resultados saindo de 30, 40 ou quantos dias for pré-filtrado para APENAS o dia da semana de 1º domingo ou 7º sábado... Portanto, ele deve retornar um conjunto de resultados de apenas 23 de abril, 24 de abril, 24 de abril 30, 1 de maio, 7 de maio, 8 de maio, 14 de maio, 15 de maio, 21 de maio, 28 de maio, etc.

Então AGORA você tem um conjunto de resultados criado dinamicamente de todos os dias possíveis que você está pensando em seguir em frente. Agora, isso é adicionado à sua tabela de reservas de local real e é filtrado para retornar APENAS as DATAS em que NÃO é encontrado para o id_venue com o qual você está preocupado. No seu exemplo de dados, ele encontraria uma correspondência em 23 e 24 de abril e NÃO retornaria esses registros. O mesmo com 30 de abril... No entanto, ele descobrirá que o registro na lista de pré-qualificação que inclui 1º de maio NÃO encontrará a data da partida na tabela do local e, portanto, incluirá isso como você está antecipando... Ele continuará pulando 7 e 8 de maio, depois retorne 14, 15, 21, 28 de maio, etc...
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

Observe que, de acordo com a postagem de outras reservas, a consulta de datas de disponibilidade de datas de reserva com um limite de 30 acima pode ser QUALQUER mesa no sistema, desde que tenha PELO MENOS tantos dias quanto você deseja aguardar as reservas. Se você deseja toda a disponibilidade para o próximo ano, você deseja 365 registros na tabela usada para um resultado cartesiano para obter o @r percorrendo os registros de "data" criados dinamicamente.