車の予約システムの一部として、次の 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 があります。ただし、顧客がある場所で車を受け取り、別の場所で配達できるため、この場所は変更されます。顧客が予約 (b_booking) を登録すると、車が配達される場所 (delivery_location) も登録されます。
しかし、私にはそれほど難しいことではないと思われることに多くの問題があります。月の初めに車が場所1にあるとしましょう。次に、顧客 X は 15-20 の予約を登録します。次に、顧客 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 を評価する必要があります..これは実際には最適ではないようです。
良い解決策はありますか?
ありがとう