sql >> Databáze >  >> RDS >> Mysql

MySQL najde první dostupný víkend

Myslím, že ostatním chybí otázka... Myslí si, že váš stůl už může být OBSAZENÝ všemi víkendy a nějakým stavem, zda je otevřený nebo ne... Hádám, že váš stůl MÁ záznam, pouze pokud je rezervován... proto musíte najít záznamy, které VŮBEC NEEXISTUJÍ... na základě nějakého automatického vyhledávání dat...

Toto je úprava jiného příspěvku, který jsem udělal zde

Přestože jsem nezměnil kontext dotazu, vložil jsem pouze sloupce spojené s VAŠÍ tabulkou. Chápu, že jdete pouze proti jednomu stolu a já také (ve skutečnosti). Abychom však porozuměli aliasu "JustDates", tento VNITŘNÍ PŘED-QUERY vytváří dynamicky naplněnou tabulku VŠECH DAT tím, že provede kartézské spojení proti JAKÉKOLI jiné tabulce. v tomto případě vaše tabulka rezervací "Venue" (neudělal jsem nevidíte explicitně odkaz na váš skutečný název tabulky, takže to budete muset změnit). Takže to v podstatě vytvoří tabulku všech dat počínaje jakýmkoli "dnešním" a pokračuje po dobu 30 dnů (přes limit), ale může to být 40, 50, 300 nebo tolik, kolik potřebujete.. za předpokladu, že "YourVenueTable" má alespoň tolik záznamů, kolik dní chcete testovat. (stejné vysvětlení v příspěvku, ze kterého to bylo odvozeno). Tato sada výsledků, která vychází 30, 40 nebo jakkoli mnoho dní, je předfiltrována POUZE pro daný den v týdnu 1-neděle nebo 7-sobota... Měla by tedy vrátit sadu výsledků pouze 23. dubna, 24. dubna, dubna 30., 1. května, 7. května, 8. května, 14. května, 15. května, 21. května, 28. května atd.

Takže TEĎ máte dynamicky vytvořenou sadu výsledků všech možných dnů, o kterých uvažujete, že se pohnete vpřed. Nyní se to připojí k vaší skutečné tabulce Rezervace míst a je filtrováno tak, aby vrátilo POUZE ta DATA, kde NENÍ nalezena pro id_venue, o které máte obavy. Ve vašem příkladu dat BY NAJDE 23. a 24. dubna shodu a NEVRÁTÍ tyto záznamy. Totéž s 30. dubnem... Zjistí však, že záznam v předkvalifikačním seznamu, který obsahuje 1. květen, NENAJDE datum shody v tabulce míst konání a zahrne jej tak, jak očekáváte... Poté bude nadále přeskakovat 7. a 8. května, poté se vraťte 14., 15., 21., 28. května atd...

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

Všimněte si, a podle dalších příspěvků o rezervacích, dotaz na data dostupnosti data rezervace s limitem 30 výše může být JAKÝKOLI stůl v systému, pokud má ALESPOŇ tolik dní, kolik se chcete na rezervace těšit. Pokud chcete veškerou dostupnost pro nadcházející rok, měli byste chtít 365 záznamů v tabulce použité pro kartézský výsledek, aby se @r procházelo dynamicky vytvářenými „datovými“ záznamy.



  1. Jak COALESCE() funguje v MariaDB

  2. Časová osa grafu Google s datem na ose x

  3. Vložte objekt binárního řetězce pythonu do objektu blob MySQL

  4. PHP, SQL limit dotazu pomocí proměnné php