2015-01-16 51 views
0

我有兩個表名carsbooking。 我想找到的是可用的預訂車,簡單的是從cars中選擇車輛的詳細信息,其ID在特定日期和時間不在預訂表中。MySQL選擇不在特定日期和時間的ID

預訂表的列有pick_date(date),drop_date(date),pick_time(time),drop_time(time),car_id(int),booking_id(int) blah blah

現在我被困在獲得可用的汽車。請你指導我如何在MySQL中做到這一點。以下是預訂表的4列。

Pick_Date Drop_Date Pick_Time  Drop_Time 
---------- ----------- -----------  -------------- 
2015-01-15 2015-01-15 09:00:00.000000 10:00:00.000000 
+0

沒有先生這是完全不同的東西 –

+0

什麼是問題和你使用什麼查詢?日期和時間沒有任何格式,它們是二進制值。 –

+0

是的,RiggsFolly提到的問題完全是一回事。 – RandomSeed

回答

0

試試這個:

SELECT c.car_id 
FROM cars c 
LEFT JOIN (SELECT car_id 
      FROM bookings 
      WHERE '2015-01-15 11:00:00' BETWEEN CAST(CONCAT(Pick_Date, ' ', Pick_Time) AS DATETIME) AND CAST(CONCAT(Drop_Date, ' ', Drop_Time) AS DATETIME) 
     ) AS A ON c.car_id = A.car_id 
WHERE A.car_id IS NULL 
+0

將函數應用於像這樣的字段可防止數據庫使用索引並導致全表掃描。 –

+0

謝謝我被困在很長的時間裏,你已經給出了非常快速和很好的答案。謝謝 –

+0

你會explian @PanagiotisKanavos? –

0

您可以使用「NOT IN」 MySql.Read的此,如果仍然需要幫助,請發表評論。

SELECT * FROM cars WHERE cars.id NOT IN (SELECT id FROM booking); 

希望這個查詢會幫助你。

1

你可以用left joinnot innot exists來做到這一點。該left join看起來像

select c.* 
from cars c left join 
    bookings b 
    on c.car_id = b.car_id and 
     @pickdt <= addtime(drop_date, drop_time) and 
     @dropdt >= addtime(pick_date, pick_time) 
where b.car_id is null; 

變量@pickdt@dropdt是你正在尋找的拿起和落倍。這將檢查該期間和預訂期間之間是否有重疊。它選擇根本沒有重疊的汽車。

注意:您應該將日期時間值存儲在單個列中,而不是兩個單獨的值與日期和時間。

+0

將函數應用於這樣的字段可防止數據庫使用索引並導致全表掃描。單列將消除該問題。事實上,WHERE'語句應該在一個比較日期的部分和一個比較時間的部分中分解,只有日期相同。非常醜陋,但確保生產性能的唯一途徑 –

+0

@PanagiotisKanavos。 。 。這可能不會導致「全表掃描」,而是在索引掃描中,因爲「car_id」上的相等條件。儘管如此,將日期/時間值存儲在單個字段中將允許使用組合索引,這會加快查詢速度。 –

+0

'car_id'上的唯一條件是對連接結果進行空檢查,因此它不具有選擇性。它確實取決於底層的數據統計信息以及查詢優化器如何決定執行查詢。在這兩種情況下,性能都會非常糟糕 –

相關問題