исключить возвращаемые значения из условия выбора - PullRequest
0 голосов
/ 28 мая 2018

у меня есть таблица ниже, называемая резервами на сервере MySQL 8.0:

RESERVES (
res_id INT NOT NULL AUTO INCREMENT,
product_id INT NOT NULL,
start_date DATE NOT NULL,
finish_date DATE NOT NULL,
PRIMARY KEY(res_id),
FOREIGN KEY(product_id) REFERENCES PRODUCT(product_id) ON UPDATE CASCADE ON DELETE RESTRICT
);

клиент заполняет форму, чтобы указать даты, которые он хочет (start_res_date и finish_res_date), поэтому я должен сделать запросчтобы проверить, доступен ли он в этот период времени.

Я застрял здесь, главным образом потому, что может быть несколько резервирований для этого конкретного продукта.

, вот так:

SELECT DISTINCT product_id FROM RESERVES
WHERE start_res_date >= finish_date OR finish_res_date <= start_date

не будет работать, потому что он вернет product_id, если он в порядке с датами одного из своих резервов.

что я хочу, это отклонить его product_id, если он недоступен хотя бы для одного резерва в таблице.

есть идеи, как к нему подойти?спасибо.

1 Ответ

0 голосов
/ 28 мая 2018

Товар резервируется в течение временного окна, если какая-либо часть его окна бронирования перекрывается с вашим окном.Это проще всего увидеть в графической форме:

Time Window

, т. Е. Зеленые столбцы представляют те другие бронирования, которые конфликтуют с вашим окном бронирования, или красные столбцы - это бронированиякоторые полностью находятся за пределами вашего окна, поэтому никаких конфликтов не возникает.

С этим графиком связан пост в блоге , в котором более подробно рассмотрено:.

Вы должны использовать SQLнапример, ниже, чтобы проверить, доступен ли продукт в данном временном интервале:

select top 1 1 ProductIsNotAvailable
from Reserves
where product_id = @productToBeReserved
and start_res_date < @newReservationFinishDate 
and finish_res_date => @newReservationStartDate

т.е. разрешить бронирование, только если вы не получите ответ 1 на вышеуказанный запрос.

...