Следното трябва да ви подтикне. може да искате да коригирате моята извадка на функцията "Current_Date()" за каквато и да е началната ви дата на резервацията и излизане толкова много дни....
Това използва MySQL вградени променливи в заявката. Вътрешната заявка е проста подготовка на променлива за резервация (@r), базирана на някаква начална дата ( current_date() ) и се присъединява към таблицата с елементи. Като не прави клауза за присъединяване, иначе ще вземе една дата за всеки елемент. В моя сценарий обмислям да изляза само 30 дни, така че приложих ограничение от първите 30 артикула. Няма друга основа, освен да ми дадете достатъчно записи, така че да не се налага да създавам временна таблица от 30 записа (или колкото дни искате да излизате). Това създава заявка с псевдоним "JustDates" и има една колона "OpenDate". Това е основата на периодите от време за тестване.
Това вече е присъединено към таблицата с артикули, но никое условие не създава декартово, което да каже за всяка дата, сравняване с всеки артикул... според клаузата WHERE, аз се интересувам само от артикули с SKU от "ABC123", ако имат 10 серийни #s или 100. Това сега ще ми даде възможни 300 или 3000 (10 серийни артикула за 30 дни или 100 серийни артикула за 30 дни.
Сега, когато имам "обхват" от всички отделни серийни номера и възможни дни за проверка на наличността, вече мога да направя запитване към системата за резервации. Така че, чрез подизбор и НЕ В за дадена съвпадаща SKU, SERIAL # и ВЪЗМОЖНАТА дата, намиращи се в резервации, искам само да запазя тези, при които дадена OpenDate НЕ е намерена. Симулирах структурите на вашите таблици и поставих шепа артикули, множество серийни номера и разпределени диапазони от дати на резервация и работи чудесно...
Очевидно бих осигурил индекси на sku/serial за производителност. Единствената допълнителна промяна, която бих могъл да направя, е при запитване спрямо резервациите, за да изключа всякакви резервации, при които крайната дата е преди въпросната начална дата за ВАШАТА заявка и по избор да няма начална дата> ПОСЛЕДНАТА дата, която обмисляте. Ако имате много резервации, обхващащи години, кой се интересува от нещо древно или нещо в бъдещето от въпросния период от време.
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