从select子句中排除返回值

时间:2018-05-28 08:53:09

标签: sql sql-server select limit return-value

我在mysql server 8.0中有以下名为reserve的表:

 $path = iconv( 'UTF-8', 'ISO-8859-1', utf8_encode($thisRow['path']) ) ;

客户将填写表格以指定他想要的日期(start_res_date和finish_res_date),因此我必须进行查询以检查此时间段是否可用。

我被困在这里,主要是因为这个特定产品可以有多个预订。

所以,像这样:

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
);

将无法正常工作,因为如果可以使用其中一个保留的日期,它将返回product_id。

我想要的是拒绝其product_id,如果它至少可用于表中的一个保留。

如何处理它的任何想法?感谢。

1 个答案:

答案 0 :(得分:1)

如果预订窗口的任何部分与您的窗口重叠,则会在时间窗口期间保留产品。这是最容易以图形形式看到的:

Time Window

即。绿色栏表示与您的预订窗口冲突的其他预订/红色栏是完全在您窗外的预订,因此不会发生冲突。

与此图相关的是a blog post更详细的内容:。

您应该使用如下所示的SQL来检查产品是否在给定时间段内可用:

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

即。如果您未收到上述查询的回复1,则仅允许预订。