2017-04-08 63 views
0

我嘗試創建一個查詢,該查詢在簽入和結帳日期之間顯示可用酒店。另外,當我預訂特定房間時,我將其預訂列設置爲1.也就是說,當結帳日期實際發生時,觸發功能會將預訂列設置爲0.按日期搜索Mysql查詢

如果所有房間酒店預訂(預訂= 1)和這些房間的入住結帳日期是特定日期(入住結帳輸入),然後不要將該酒店列入清單。我的查詢不顯示我想要的結果。

查詢:輸入:國家(州),登記和結帳。

SELECT DISTINCT a.* FROM accommodation a INNER JOIN cb_states s ON a.state = s.id 
INNER JOIN accommodation_rooms ar ON a.id = ar.accommodation 
WHERE state = 1 AND a.id NOT IN 
(
    SELECT 1 FROM booking b 
    WHERE 
    (
     (b.arrival_date BETWEEN '2017-11-16' AND '2018-03-16') 
     OR 
     (b.departure_date BETWEEN '2017-11-16' AND '2018-03-16') 
    ) 
) 

當我運行查詢時,它總是顯示所有酒店,不管日期。如果我寫... WHERE ar.booked = 0 AND state = 1 AND a.id NOT IN...,那麼它不顯示住宿ID 13,但它不會顯示當我更改日期。

收納臺: table 1

accommodation_rooms表: table 2

預訂表: table 3

booked_rooms表:(有預訂表的外鍵) table 4

回答

1

你有多 問題與您的查詢:

  1. NOT IN名單有SELECT 1。這並沒有給NOT IN列表種類繁多。
  2. 你的重疊邏輯是錯誤的。
  3. 我認爲你需要將住宿房間連接到預定的住宿房間。

所以:

SELECT DISTINCT a.* 
FROM accommodation a INNER JOIN 
    cb_states s 
    ON a.state = s.id INNER JOIN 
    accommodation_rooms ar 
    ON a.id = ar.accommodation 
WHERE s.state = 1 AND 
     a.id NOT IN (SELECT br.accommodation_room 
        FROM booking b JOIN 
         booked_room br 
         ON b.?? = br.?? 
        WHERE b.arrival_date <= '2018-03-16' AND 
         b.departure_date >= '2017-11-16' 
       ); 
+0

可能是什麼我的情況最好的邏輯是什麼? –

+0

@MalenaT。 。 。這有邏輯修復。 '<='而不是'between'找到*任何*重疊。 –

+0

我明白了。謝謝,'b。? = br。??'在這裏,我寫了'b.id = br.booking',它仍然顯示錯誤的結果。另外,我將住宿房間連接到了子查詢中的預訂房間'......加入了預訂房間,並且再次顯示錯誤的結果。 –