sql >> Databasteknik >  >> RDS >> Mysql

MySQL hitta första lediga helgen

Jag tror att de andra saknar frågan... De tror att ditt bord kanske redan är POPULERAD med alla helger och någon status som öppet eller inte... Min gissning är att ditt bord bara HAR ett rekord OM det är reserverat... därför måste du hitta poster som INTE FINNS ALLS... baserat på några automatiska Sök efter datum...

Det här är en modifiering av ett annat inlägg jag har gjort här

Även om jag inte ändrade kontexten för frågan, lade jag bara in de kolumner som är kopplade till DIN tabell. Jag förstår att du bara går emot ett enda bord och det gör jag (faktiskt). Men för att förstå aliaset "JustDates" skapar denna INRE FÖRFÖRFRÅGA en dynamiskt fylld tabell med ALLA DATUM genom att göra en kartesisk koppling mot NÅGON annan tabell. i det här fallet, din "Venue"-tabell med reservationer (jag gjorde'' inte se din faktiska tabellnamnsreferens uttryckligen, så du måste ändra det). Så, detta skapar i huvudsak en tabell över alla datum från vad "idag" än är och fortsätter i 30 dagar (via limit), men kan vara 40, 50, 300 eller så många som du behöver.. förutsatt att "YourVenueTable" har minst lika många rekord som dagar du vill testa för. (samma förtydligande i inlägget som detta härrörde från). Denna resultatuppsättning som går ut 30, 40 eller hur många dagar som helst är förfiltrerad för ENDAST den givna veckodagen 1-söndag eller 7-lördag... Så den bör returnera en resultatuppsättning på endast 23 apr, 24 apr, apr. 30, 1 maj, 7 maj, 8 maj, 14 maj, 15 maj, 21 maj, 28 maj osv.

Så NU har du en dynamiskt skapad resultatuppsättning av alla möjliga dagar du funderar på att gå vidare. Nu ansluts det till din faktiska platsreservationstabell och filtreras för att ENDAST returnera de DATUM där det INTE hittas för den id_venue du är orolig för. I ditt dataexempel SKULLE den hitta en matchning den 23 och 24 april och INTE returnera dessa poster. Samma sak med 30 apr... Den KOMMER dock att upptäcka att posten i prekvallistan som inkluderar 1 maj INTE kommer att hitta datummatchen i lokaltabellen och därmed inkludera det som du förväntar dig... Det kommer då att fortsätta att hoppa över 7 och 8 maj, sedan tillbaka 14, 15, 21, 28 maj osv...

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

Observera, och enligt de andra bokningsposterna, kan frågan om bokningsdatum för tillgänglighetsdatum som gör en gräns på 30 ovan vara VILKA bord i systemet så länge det har MINST så många dagar ute som du vill se fram emot bokningar. . Om du vill ha all tillgänglighet för ett kommande år, skulle du vilja ha 365 poster i tabellen som används för ett kartesiskt resultat för att få @r att cykla genom dynamiskt skapade "datum"-poster.



  1. Laravel MySql DB-anslutning med SSH

  2. Hur begränsar man röster per dag med IP i Php+Mysql-röstning?

  3. Använd APP_NAME() för att hämta applikationsnamnet för den aktuella sessionen i SQL Server

  4. Eliminera och minska överlappande datumintervall