Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MySQL znajduje pierwszy dostępny weekend

Myślę, że innym brakuje pytania... Uważają, że Twój stół może być już ZAPEŁNIONY przez wszystkie weekendy i pewien status, czy jest otwarty, czy nie... Domyślam się, że Twój stół MA rekord tylko JEŚLI jest zarezerwowany... dlatego musisz znaleźć rekordy, które W OGÓLE NIE ISTNIEJĄ... w oparciu o automatyczne wyszukiwanie dat...

To jest modyfikacja innego posta, który zrobiłem tutaj

Chociaż nie zmieniłem kontekstu zapytania, umieściłem tylko kolumny związane z TWOJĄ tabelą. Rozumiem, że grasz tylko przeciwko jednemu stolikowi, tak jak ja (właściwie). Jednak, aby zrozumieć alias „JustDates”, to WEWNĘTRZNE ZAPYTANIE WSTĘPNE tworzy dynamicznie zapełnianą tabelę WSZYSTKICH DATY, wykonując sprzężenie kartezjańskie z DOWOLNĄ inną tabelą.. w tym przypadku Twoja tabela rezerwacji „Miejsce” (nie zrobiłem tego t zobaczyć wprost odwołanie do nazwy tabeli, więc będziesz musiał to zmienić). Tak więc w istocie tworzy to tabelę wszystkich dat, zaczynając od tego, co jest „dzisiaj” i ciągnie się dalej przez 30 dni (przez limit), ale może być 40, 50, 300 lub tyle, ile potrzebujesz. ma co najmniej tyle rekordów, ile dni chcesz testować. (to samo wyjaśnienie w poście, z którego pochodzi). Ten zestaw wyników o wartości 30, 40 lub dowolnej liczbie dni jest wstępnie filtrowany TYLKO dla danego dnia tygodnia (1-niedziela lub 7-sobota...) Więc powinien zwrócić zestaw wyników zawierający tylko 23 kwietnia, 24 kwietnia, 30, 1 maja, 7 maja, 8 maja, 14 maja, 15 maja, 21 maja, 28 maja itd.

Więc TERAZ masz dynamicznie tworzony zestaw wyników dla wszystkich możliwych dni, które rozważasz posunięcie się naprzód. Teraz jest on dołączany do Twojej rzeczywistej tabeli rezerwacji miejsca i jest filtrowany tak, aby zwracał TYLKO te DATY, w których NIE znaleziono go dla lokalizacji id_venue, o którą się martwisz. W twoim przykładzie danych BYŁBY zgodny z 23 i 24 kwietnia i NIE zwróciłby tych rekordów. To samo z 30 kwietnia… Jednakże, okaże się, że rekord na liście prekwalifikacyjnej, która obejmuje 1 maja, NIE znajdzie daty meczu w tabeli miejsc, a tym samym uwzględni to, jak się spodziewasz… Następnie będzie nadal pomijać 7 i 8 maja, potem powrót 14, 15, 21, 28 maja itd...

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

Uwaga, i zgodnie z innymi publikacjami rezerwacji, zapytanie o terminy dostępności rezerwacji z limitem 30 powyżej może być DOWOLNĄ tabelą w systemie, o ile ma co najmniej tyle dni, ile chcesz oczekiwać na rezerwacje. . Jeśli chcesz mieć pełną dostępność w nadchodzącym roku, potrzebujesz 365 rekordów w tabeli używanych dla wyniku kartezjańskiego, aby uzyskać @r przechodzenie przez dynamicznie tworzone rekordy „daty”.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kolejność zapytań MySQL według wielu elementów

  2. Jak dołączyć schemat bazy danych MySQL na GitHub?

  3. Jak działa wyszukiwanie pełnotekstowe MySQL?

  4. ANDROID&PHP - Jak wyświetlić JSONArray z MySql za pomocą PHP

  5. Proste szyfrowanie hasła - jak to zrobić?