Mysql Query从表格问题获得免费汽车,逻辑错误

时间:2015-12-05 16:07:00

标签: mysql sql sql-server innodb

我遇到一些问题,理解和避免我的一个查询中的问题。

我正在进行查询,我尝试在选定的时间段内选择可用的汽车 - 但是我遇到了问题。如果租用汽车,我选择的时间。在这种情况下,我的3辆车全部租用:2015-04-20至2015-04-25。另一项预订是在2015年1月26日至2015年4月30日的1号车上。 当我的查询在计时器期间将Car1返回为免费时出现问题:2015-04-20至2015-04-25,而实际上仍然在另一个预订中。

它返回car1的原因是,从2015-04-26到2015-04-30的预订有car1并且它满足要求,因为它不在租期内。

我当前的逻辑。如果出现以下情况,可以免费使用汽车:

// Case 1: dropoff < r.pickup
// Case 2: pickup > r. dropoff
// Case 3: IF FK_CarID == Null 

我的文字可能很难理解,所以这里有一个SQLfiddle链接:http://sqlfiddle.com/#!9/13392/1
Theres代码用于创建所有表和我的查询。 而且你可以看到它返回1,即使采取1。因此,如果在该时间段内已经采取1,则需要以某种方式使其忘记1。也许通过使用“之间”,但无法弄清楚如何阻止它返回其他1,当它发现1不是一个选项时。

此处还有一个表格和查询图片,用于概述目的: Mysql Reservation Table and flawed Query

为了便于使用,这里是查询:

SELECT DISTINCT c.CarID FROM Cars c 
LEFT JOIN Reservations r ON (c.CarID = r.FK_car)
WHERE '2015-04-25' < r.pickUpDate 
OR r.FK_car IS NULL 
OR '2015-04-20' > r.dropOffDate;

创建表预订和汽车:

CREATE TABLE Cars (
        carID INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
        model VARCHAR(255) NOT NULL, 
        make VARCHAR(255) NOT NULL, 
        creationYear INT(4) NOT NULL, 
        licenseNum VARCHAR(7) NOT NULL, 
        FK_station INT(6) UNSIGNED, 
        CONSTRAINT FOREIGN KEY (FK_station) 
            REFERENCES Stations(stationID) 
            ON UPDATE CASCADE 
            ON DELETE SET NULL 
        ) ENGINE=InnoDB;

CREATE TABLE Reservations (
        ReservationID INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
        pickUpDate DATE NOT NULL, 
        dropOffDate DATE NOT NULL, 
        FK_customer INT(6) UNSIGNED, 
        FK_car INT(6) UNSIGNED, 
        CONSTRAINT FOREIGN KEY (FK_customer) 
            REFERENCES Customers(customerID) 
            ON UPDATE CASCADE 
            ON DELETE SET NULL, 
        CONSTRAINT FOREIGN KEY (FK_car) 
            REFERENCES Cars(carID) 
            ON UPDATE CASCADE 
            ON DELETE SET NULL 
        ) ENGINE=InnoDB;

希望你能帮助我解决我的错误逻辑。我对MySQL很陌生,所以以正确的方式思考仍然是一个挑战。

2 个答案:

答案 0 :(得分:0)

这应该有效:

SELECT distinct(car.carID) FROM Cars car
    where car.carId not in (
      select r.FK_car from Reservations r 
      WHERE (r.pickUpDate >= '2015-04-20' and r.pickUpDate <= '2015-04-25')
      and (r.dropOffDate >= '2015-04-20' and r.dropOffDate <= '2015-04-25')
      or (r.pickUpDate < '2015-04-20' and r.dropOffDate > '2015-04-25')
    )

在预订中选择的车辆:

  • 取件和送货日期在
  • 范围内
  • 取件在范围之前开始,在范围之后结束。

答案 1 :(得分:0)

我们应该得到所有记录,其中没有预定的给定范围...子查询将首先找到所有在给定时间段内有预订的车...然后它将排除我们拥有的总车辆中的那些......所以我们可以按照以下步骤进行:

 Select distinct fk_car from Reservations where fk_car not in
(
Select fk_car from Reservations
where pickupdate<='2015-04-20' and dropoffdate>='2015-04-25'
);