Mysql 查询从 table 获得免费汽车的逻辑有缺陷的问题
Mysql Query get free cars from table issue with flawed logic
我在理解和避免我的一个查询中的问题时遇到了一些问题。
我正在查询 select 在 select 时间段内可用的汽车 - 但是我遇到了问题。如果租一辆车,我select。在这种情况下,我所有的 3 辆车都是从 2015-04-20 到 2015-04-25 租来的。唯一的其他预订是在 2015-04-26 至 2015-04-30 期间的 1 号车厢。
当我的查询然后 returns Car1 在计时器期间免费时出现问题:2015-04-20 到 2015-04-25,而实际上仍在另一个预订中。
之所以returnscar1,是因为2015-04-26到2015-04-30的预订有car1,而且不在租期内,符合条件
我目前的逻辑。在以下情况下可以免费使用汽车:
// Case 1: dropoff < r.pickup
// Case 2: pickup > r. dropoff
// Case 3: IF FK_CarID == Null
从我的文字中可能很难理解,所以这是一个 SQLfiddle link:http://sqlfiddle.com/#!9/13392/1
这是创建所有 table 和我的查询的代码。
你可以看到它 returns 1 即使 1 被占用了。因此,如果在该时间段内已使用 1,则需要以某种方式让它忘记 1。也许通过使用 "between",但无法弄清楚如何阻止它返回其他 1,当它发现 1 不是一个选项时。
这里还有一张 table 的图像和用于概览的查询:
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;
并创建 table 预订和汽车:
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 的新手,所以以正确的方式思考仍然是一个挑战。
这应该有效:
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')
)
也就是说 select 辆 不是 的预订车:
- 取件和还件日期在范围内
- 取件在范围之前开始并在范围之后结束。
我们应该获取给定范围内没有预订的所有记录...子查询将首先找到在给定时间段内有预订的所有汽车...然后它将从总汽车中排除那些我们有...所以我们可以按以下方式进行:
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'
);
我在理解和避免我的一个查询中的问题时遇到了一些问题。
我正在查询 select 在 select 时间段内可用的汽车 - 但是我遇到了问题。如果租一辆车,我select。在这种情况下,我所有的 3 辆车都是从 2015-04-20 到 2015-04-25 租来的。唯一的其他预订是在 2015-04-26 至 2015-04-30 期间的 1 号车厢。 当我的查询然后 returns Car1 在计时器期间免费时出现问题:2015-04-20 到 2015-04-25,而实际上仍在另一个预订中。
之所以returnscar1,是因为2015-04-26到2015-04-30的预订有car1,而且不在租期内,符合条件
我目前的逻辑。在以下情况下可以免费使用汽车:
// Case 1: dropoff < r.pickup
// Case 2: pickup > r. dropoff
// Case 3: IF FK_CarID == Null
从我的文字中可能很难理解,所以这是一个 SQLfiddle link:http://sqlfiddle.com/#!9/13392/1
这是创建所有 table 和我的查询的代码。
你可以看到它 returns 1 即使 1 被占用了。因此,如果在该时间段内已使用 1,则需要以某种方式让它忘记 1。也许通过使用 "between",但无法弄清楚如何阻止它返回其他 1,当它发现 1 不是一个选项时。
这里还有一张 table 的图像和用于概览的查询: 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;
并创建 table 预订和汽车:
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 的新手,所以以正确的方式思考仍然是一个挑战。
这应该有效:
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')
)
也就是说 select 辆 不是 的预订车:
- 取件和还件日期在范围内
- 取件在范围之前开始并在范围之后结束。
我们应该获取给定范围内没有预订的所有记录...子查询将首先找到在给定时间段内有预订的所有汽车...然后它将从总汽车中排除那些我们有...所以我们可以按以下方式进行:
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'
);