2012-04-29 99 views
2

我知道標題真的很荒謬。我無法找到我如何描述這一點。如何從表中刪除結果到另一個表?

這是我的表結構 enter image description here

這是一個汽車租賃網頁。我正在做的是我試圖找出一輛車是否特別保留「pickup日期」和「下降日期」。 我可以得到這個查詢

SELECT 
cars.model, 
reservations.pickup_date, 
reservations.dropoff_date, 
reservations.car_id 
FROM 
cars 
INNER JOIN reservations ON cars.car_id = reservations.car_id 
WHERE 
reservations.pickup_date <= '2012-04-08 10:50:26' OR 
reservations.dropoff_date >= '2012-04-20 10:50:26' 

保留汽車不過,也有一些車沒有被保留,他們沒有在此查詢顯示,因爲我不知道所有車型的預訂。我有他們在汽車表。

底線是,我應該消除從具有所有車型的表中的此查詢中得到的結果。因此,我將擁有未預訂的汽車+在預訂日期之後提供的汽車。

它會得到我從查詢中得到的結果,並從汽車表中消除該結果。之後它會顯示我。

我可以用PHP來做到這一點。但是,我想了解是否可以使用mysql執行一個查詢。

這是我與@cbuckley

SELECT 
cars.* 
FROM cars 
LEFT JOIN (
    SELECT 
    cars.car_id 
    FROM 
    cars 
    INNER JOIN reservations 
    ON cars.car_id = reservations.car_id 
    WHERE 
    (reservations.pickup_date <= '2012-04-08 10:50:26' AND reservations.dropoff_date >= '2012-04-20 10:50:26') OR 
    (reservations.pickup_date >= '2012-04-08 10:50:26' AND reservations.pickup_date <= '2012-04-20 10:50:26') OR 
    (reservations.dropoff_date <= '2012-04-20 10:50:26' AND reservations.dropoff_date >= '2012-04-08 10:50:26') 
) AS reserved_cars 
ON reserved_cars.car_id = cars.car_id 
WHERE reserved_cars.car_id IS NULL; 

回答

0

您需要小心區分汽車在給定時間沒有保留汽車在預定時間以外的時間。前者是你所追求的,可以通過WHERE NOT IN條款來實現。然而,隨着您的汽車和預訂系統的增長,這可能變得極其緩慢。我建議如下:

SELECT 
cars.* 
FROM cars 
LEFT JOIN (
    SELECT 
    cars.car_id 
    FROM 
    cars 
    INNER JOIN reservations 
    ON cars.car_id = reservations.car_id 
    WHERE 
    reservations.pickup_date <= '2012-04-08 10:50:26' OR 
    reservations.dropoff_date >= '2012-04-20 10:50:26' 
) AS reserved_cars 
ON reserved_cars.car_id = cars.car_id 
WHERE reserved_cars.car_id IS NULL; 

內部查詢是您指定查找所有保留的汽車。然後,您將它加入cars表中,查找內部查詢未返回的所有車輛。這適用於您對子查詢執行LEFT JOIN並且只返回子查詢中沒有匹配的行。

編輯:如果您想查詢找到所有的汽車,其可在一定時間內,你的內心查詢需要以搜索開始或週期內結束預訂。因此,您將使用以下條件:

... WHERE 
reservations.pickup_date BETWEEN '2012-04-08 10:50:26' AND '2012-04-20 10:50:26' OR 
reservations.dropoff_date BETWEEN '2012-04-08 10:50:26' AND '2012-04-20 10:50:26' 
+0

現在它顯示了不是「保留」的汽車。但它不顯示不在保留期內的那些。例如,我有預訂,pickup pickup日期是「2012-04-21」,dropoff_date是「2012-04-26」。它應該告訴我這個查詢。它只顯示那些沒有保留的。 – SNaRe

+0

我不太確定我是否理解你的原始問題。看起來你想要返回所有與你的查詢不匹配的汽車,這是上面所做的。你的最終目標是什麼?你想在2個日期之間返回所有可用的汽車嗎?如果是這樣,我將編輯內部查詢。如果不是,請在這裏或在您的問題中澄清。 – cmbuckley

+0

我更關注算法。我意識到還有其他條件需要考慮。我更新了我的問題。你可以看到解決方案。謝謝你的幫助。 – SNaRe

1

使用左的幫助下想出瞭解決方案加入,而不是內部聯接

SELECT 
cars.model, 
reservations.pickup_date, 
reservations.dropoff_date, 
reservations.car_id 
FROM 
cars 
LEFT JOIN reservations ON cars.car_id = reservations.car_id 
WHERE 
reservations.pickup_date <= '2012-04-08 10:50:26' OR 
reservations.dropoff_date >= '2012-04-20 10:50:26' 

它會給你所有的車太誰是尚未預訂

+0

它不會在保留表中得到未處於狀態的汽車。認爲這輛車是免費的。有20輛汽車,其中只有5輛現在保留。其他人在車庫。 – SNaRe

相關問題