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