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

Pomoc z zapytaniem SQL, aby znaleźć następny wolny termin dla systemu rezerwacji

Poniższe powinno Cię zachęcić. możesz chcieć dostosować moją próbkę funkcji „Current_Date()” do dowolnej daty rozpoczęcia rezerwacji i wyjścia z niej przez tyle dni....

Wykorzystuje w zapytaniu zmienne wbudowane MySQL. Zapytanie wewnętrzne polega na prostym przygotowaniu zmiennej rezerwacji (@r) na podstawie określonej daty początkowej ( current_date() ) i dołączeniu do tabeli pozycji. Nie robiąc klauzuli dołączania, w przeciwnym razie złapałby jedną datę dla każdego elementu. W moim scenariuszu rozważam tylko 30 dni, więc zastosowałem limit pierwszych 30 pozycji. Nie ma innej podstawy niż danie mi wystarczającej liczby rekordów, abym nie musiał tworzyć tymczasowej tabeli zawierającej 30 rekordów (lub ile dni chcesz wyjść). Spowoduje to utworzenie zapytania z aliasem „JustDates” i pojedynczej kolumny „OpenDate”. To jest podstawa testowanych zakresów dat.

Jest to teraz połączone z tabelą pozycji, ale żaden warunek nie tworzy kartezjańskiego zapisu dla każdej daty, porównaj z każdą pozycją... zgodnie z klauzulą ​​WHERE, interesują mnie tylko pozycje o numerze SKU „ABC123”, jeśli mają 10 numerów seryjnych #s lub 100. Dałoby to teraz możliwe 300 lub 3000 (10 pozycji seryjnych @ 30 dni lub 100 pozycji seryjnych @ 30 dni.

Teraz, gdy mam „zakres” wszystkich indywidualnych numerów seryjnych i możliwych dni, aby sprawdzić dostępność, mogę teraz zapytać o system rezerwacji. Tak więc, poprzez podwybór, a NIE W dla danego pasującego SKU, SERIAL # i MOŻLIWEJ Daty znalezionej w rezerwacjach, chcę zachować tylko te, w których dana OpenDate NIE została znaleziona. Zasymulowałem strukturę stołu i umieściłem garść przedmiotów, wiele numerów seryjnych i przesunięte zakresy dat rezerwacji i działa to świetnie...

Oczywiście zapewniłbym indeksy na sku / serial dla wydajności. Jedyną dodatkową zmianą, jaką mogę wprowadzić, jest przy zapytaniach dotyczących rezerwacji, aby wykluczyć wszelkie rezerwacje, w których data zakończenia jest wcześniejsza od daty rozpoczęcia zapytania dla TWOJEGO zapytania i opcjonalnie brak daty rozpoczęcia> OSTATNIA data, którą rozważasz. Jeśli masz mnóstwo rezerwacji na przestrzeni lat, kogo obchodzi coś starożytnego lub coś w przyszłości z danego zakresu dat.

select  items.sku,
        items.serial_number,
        JustDates.OpenDate
    from 
        ( SELECT 
                 @r:= date_add(@r, interval 1 day ) OpenDate
            FROM 
                 (select @r := current_date()) vars,
                items limit 30 ) JustDates,
        items
    where 
            sku = "ABC123"
        and sku not in ( select sku from Reservations
                            where items.sku = reservations.sku
                              and items.serial_number = reservations.serial_number
                              and justDates.OpenDate >= reservations.start_date
                              and justDates.OpenDate <= reservations.end_date )
    order by 
       items.serial_number,
       justDates.OpenDate


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. java.sql.SQLException:Nieprawidłowa wartość ciągu:'\xF0\x9F\x91\xBD\xF0\x9F...'

  2. Indeks rozwiązywania dla użytkownika tabeli jest uszkodzony; spróbuj to naprawić

  3. odpowiednik pdo mysql_data_seek

  4. Importuj pliki .frm i .opt do MySQL

  5. Laravel:Pobierz obiekt z kolekcji według atrybutów