我将以下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)将具有代表av位置的int,其中可以拾取或交付汽车。但是,由于客户可以在一个地方取车并在另一个地方交货,因此这个位置会发生变化。当客户注册预订(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。这看起来并不是最佳的。
有什么好的解决方案吗?
由于
答案 0 :(得分: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]
。
我怀疑汽车的类型对于客户来说非常重要,因此最好在所选位置寻找特定的汽车类型。
此外,我建议在交货时检查汽车是否在所需位置。