【发布时间】:2015-12-05 16:06:59
【问题描述】:
我在理解和避免我的一个查询中遇到问题时遇到了一些问题。
我正在查询,我尝试在选定的时间段内选择可用的汽车 - 但是我遇到了一个问题。如果一辆车是租的,我选择的时间段。在这种情况下,我所有的 3 辆车都是从 2015 年 4 月 20 日到 2015 年 4 月 25 日租的。唯一的其他预订是 1 号车厢,从 2015 年 4 月 26 日到 2015 年 4 月 30 日。 当我的查询在计时器期间返回 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
有用于创建所有表和我的查询的代码。
你可以看到它返回 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;
以及Reservations和Cars表的创建:
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 还很陌生,所以以正确的方式思考仍然是一个挑战。
【问题讨论】:
标签: mysql sql sql-server innodb