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 があります。ただし、顧客がある場所で車を受け取り、別の場所で配達できるため、この場所は変更されます。顧客が予約 (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 を評価する必要があります..これは実際には最適ではないようです。

良い解決策はありますか?

ありがとう

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 に答える