2012-11-26 121 views
2

最大我有以下3代表作爲汽車的預訂系統的一部分:Mysql的選擇具有閾

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 ..這看起來似乎並不理想。

任何好的解決方案?

謝謝

+0

我無法理解您的問題的性質,您是否一次只能爲汽車提供一次送貨預訂?那麼爲什麼你沒有開始和結束預訂(所以有人在尋找一輛跨越這些日期的汽車可以被忽略。)AND(bookingStart <'END_DATE_STRING'或bookingEnd>'START_DATE_STRING')')? – scragar

回答

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]

我懷疑汽車的類型對客戶來說很重要,所以也許最好在所選位置尋找特定的汽車類型。

此外,我會建議檢查在交付時汽車是否在預期位置。