Mysql 查询从逻辑有缺陷的表问题中获取免费汽车

标签 mysql sql sql-server innodb

我在理解和避免其中一个查询中出现问题时遇到一些问题。

我正在查询,尝试在选定的时间段内选择可用的汽车 - 但是我遇到了问题。如果租车,则在我选择的期限内。在这种情况下,我所有的 3 辆车都是从 2015-04-20 到 2015-04-25 租的。唯一的其他预订是 2015 年 4 月 26 日至 2015 年 4 月 30 日期间的 1 号车厢。 当我的查询在计时器周期(2015-04-20 到 2015-04-25)内返回免费的 Car1 时,就会出现问题,而实际上仍然在另一个预订中。

返回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 还很陌生,所以以正确的方式思考仍然是一个挑战。

最佳答案

这应该有效:

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

也就是说,选择预订中的汽车:

  • 接送日期在范围内
  • 拾取在范围之前开始并在范围之后结束。

关于Mysql 查询从逻辑有缺陷的表问题中获取免费汽车,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34107598/

相关文章:

mysql - 如何计算 char 数据类型列中的行数

mysql - 一张表中的多项计数功能

sql - 在 SQL Server 中格式化时间?

mysql - 进行 SQL 查询以给出如下所示的特定结果

sql-server - CONTAINSTABLE 如何处理多个搜索词

c# - 如何使用 C#、ASP.NET、SQL Server 端处理实现 jQuery DataTables 插件?

mysql - 用户最终具有相同的 id...可能的竞争条件?

mysql - 是否可以从 CentOS 命令行执行数据库插入?

sql - 使用 PostgreSQL 按 3 列检查数据的唯一性

sql-server - 当以另一种形式保存数据时,Vb.Net 以主形式更新 Datagridview