2

作为汽车预订系统的一部分,我有以下 3 个表格:

CREATE TABLE `b_booking` (
    `id` INT(10) NOT NULL AUTO_INCREMENT,
    `b_car_id` VARCHAR(15) NOT NULL,
    `uc_user_id` INT(11) NOT NULL,
    `booking_date` DATE NOT NULL,
    `delivery_date` DATE NOT NULL,
    `delivery_location` INT(10) NULL DEFAULT NULL,
    PRIMARY KEY (`id`),
    INDEX `FK_b_booking_b_car` (`b_car_id`),
    INDEX `FK_b_booking_uc_users` (`uc_user_id`),
    INDEX `FK_b_booking_b_location` (`delivery_location`),
    CONSTRAINT `FK_b_booking_b_location` FOREIGN KEY (`delivery_location`) REFERENCES `b_location` (`id`),
    CONSTRAINT `FK_b_booking_b_car` FOREIGN KEY (`b_car_id`) REFERENCES `b_car` (`id`),
    CONSTRAINT `FK_b_booking_uc_users` FOREIGN KEY (`uc_user_id`) REFERENCES `uc_users` (`id`)

CREATE TABLE `b_car` (
    `id` VARCHAR(15) NOT NULL,
    `b_carmodel_id` INT(10) NOT NULL,
    `day_cost` INT(10) NOT NULL,
    `location` INT(10) NOT NULL,
    `model_year` SMALLINT(4) NOT NULL,
    PRIMARY KEY (`id`),
    INDEX `FK_b_car_b_carmodel` (`b_carmodel_id`),
    INDEX `FK_b_car_b_location` (`location`),
    CONSTRAINT `FK_b_car_b_location` FOREIGN KEY (`location`) REFERENCES `b_location` (`id`),
    CONSTRAINT `FK_b_car_b_carmodel` FOREIGN KEY (`b_carmodel_id`) REFERENCES `b_carmodel` (`id`)

CREATE TABLE `b_location` (
    `id` INT(10) NOT NULL AUTO_INCREMENT,
    `adress` VARCHAR(100) NOT NULL,
    `b_postal_zip` SMALLINT(4) UNSIGNED NOT NULL,
    PRIMARY KEY (`id`),
    INDEX `FK_b_location_b_postal` (`b_postal_zip`),
    CONSTRAINT `FK_b_location_b_postal` FOREIGN KEY (`b_postal_zip`) REFERENCES `b_postal` (`zip`)

给定的汽车 (b_car) 将有一个 int 表示可以取车或交付汽车的 av 位置。但是,由于客户可以在一个位置取车并在另一个位置交付,因此该位置将发生变化。当客户注册预订 (b_booking) 时,他/她还注册了汽车将在什么位置交付 (delivery_location)。

但是,在我看来不应该那么难的事情上,我遇到了很多问题:假设一辆车在月初位于位置 1。然后,客户 X 注册了 15-20 的预订。并在地点 2 登记交货。然后客户 Y 希望预订同一辆车。所以我需要一个考虑到日期和位置的查询。

SELECT c.id, c.location, b.delivery_location, MAX(b.delivery_date) FROM b_car c
LEFT JOIN b_booking b ON b.b_car_id = c.id
WHERE b.delivery_date < '2012-11-28' OR b.delivery_date IS NULL 
GROUP BY c.id;

我试过类似的东西。我将选择所有没有左连接预订的汽车,它还将选择最后一次预订(与给定日期相关的最后一次预订)。当然,问题在于 where 条件还排除了任何日期高于提供日期的预订。此外,使用此解决方案,我不得不同时获取位置(来自 b_car)和交付位置(来自 b_booking),并且可能使用 php 或其他东西在 delivery_location 上评估 null .. 这似乎不是最佳的。

有什么好的解决办法吗?

谢谢

4

1 回答 1

0

我不确定你的问题是什么。我认为您的问题是根据特定日期的预订系统中的计划找出哪些汽车可用。在这种情况下,您需要的唯一信息是来自汽车和位置以及根据预订系统的 ID。

顺便说一句,我建议在您的餐桌上增加时间,因为您可能想在同一天租一辆车。如果客户 A 在 12:00 之前还车,您可以在 13:00 轻松将同一辆车出租给客户 B。

SELECT c.id, b.delivery_location, b.delivery_date FROM b_car AS c
LEFT JOIN b_booking AS b ON b.id = c.id
WHERE b.delivery_date = '2012-11-28' and b.delivery_location = 1;

我简化了您的查询,因为我认为这将为您提供所需的信息。如果客户想要租车,您需要知道该车是否在指定位置的规划中可用。

如果您想知道日期之间的可用性,请使用WHERE b.delivery_date between [start date] AND [end date].

我怀疑汽车的类型对客户很重要,所以最好在选择的位置寻找特定的汽车类型。

此外,我建议在交货时检查汽车是否实际在所需位置。

于 2013-01-15T02:50:39.803 回答