2012-12-20 50 views
4

您好,我有2層表間客房,預訂,但我的表內在張力結構不同的一點, 在預訂表有roomid,日期,例如狀態:的客房供應情況

101,2012-12-10,0 
101,2012-12-11,0 
101,2012-12-12,1 
101,2012-12-13,0 
102,2012-12-10,0 
102,2012-12-11,0 
102,2012-12-12,0 

,我想根據此請求在2012-12-10和2012-12-13 之間找到可用房間,只有房間102應該退回。

我試過

SELECT id 
FROM status 
WHERE status='0' 
    AND date between '2012-12-10' AND '2012-12-13' 
GROUP BY id 

這是行不通的,因爲即使只找到一個可用行返回了101

所以101真的是供2012年12月11日再出像可用但對於我們的數據範圍並不好。

+0

是您的日期列datetime數據類型? – SnareChops

+0

是日期列 – canerkoroglu

+0

你想使用之間,還是更好地使用> =和<?如果你也有一行'102,2012-12-13,1',這是否意味着房間在間隔中不可用?我認爲這是 – fthiella

回答

1

這將選擇所有的客房,在區間沒有一行status=1你選擇。請注意,我沒有使用between:如果status=1在12月13日,房間仍然是可用的間隔,這就是爲什麼我使用>= and <

SELECT roomid 
FROM status 
WHERE `date` >= '2012-12-10' 
     AND `date` < '2012-12-13' 
GROUP BY roomid 
HAVING sum(status.status=1)=0 

如果有也可能是您的表中的某些缺失天,如果這意味着該房間沒有預訂,但也沒有用,你也可以使用此查詢:

SELECT roomid 
FROM status 
WHERE `date` >= '2012-12-10' 
     AND `date` < '2012-12-13' 
     AND status=0 
GROUP BY roomid 
HAVING count(*)=DATEDIFF('2012-12-13', '2012-12-10') 

,檢查該天的間隔數等於與地位的行數= 0。

+0

我編輯過這個查詢,但它不起作用,哪裏錯了? SELECT ed。* FROM emlaklar ed INNER JOIN ((SELECT emlak_id FROM fiyatlar WHERE'tarih''2012-12-10'and'2012-12-18'GROUP BY emlak_id HAVING sum(durum = 1)= 0)AS f ON ed.id = f.emlak_id) – canerkoroglu

+0

@ user1919682我認爲你不需要雙'((',你只需要一個,你可以刪除關閉')'在末尾 – fthiella

+0

它現在工作真的很有趣:) 非常感謝你。 – canerkoroglu

1

如果日期有關聯的時候,你需要做這樣的事情:

SELECT id 
FROM status 
WHERE status='0' 
    AND date between '2012-12-10 00:00:00' AND '2012-12-13 23:59:59' 
GROUP BY id 

您也可以使用日期(日期),而不是包括時間,但是這可能是低效率的。

+0

我試過,但同樣,因爲如果你檢查預訂表查詢可以找到像2012-12-11可用一個免費日期,這個日期是可用的,但2012-12-12不是。結果顯示可用但不允許日期範圍 – canerkoroglu

+0

根據您希望包含的日期,您只需更改時間/日期。 – lilwupster

1

您應該能夠使用以下命令:

SELECT roomid 
FROM status s1 
WHERE status='0' 
    AND date between '2012-12-10' AND '2012-12-13' 
    and not exists (select roomid 
        from status s2 
        where status='1' 
        AND date between '2012-12-10' AND '2012-12-13' 
        and s1.roomid = s2.roomid) 
GROUP BY roomid 

SQL Fiddle with demo

1

試試這個:

SELECT rd.* 
FROM room_details rd 
INNER JOIN (SELECT DISTINCT roomid FROM bookings 
      WHERE roomid NOT IN (SELECT roomid FROM bookings 
           WHERE STATUS =0 AND DATE BETWEEN '2012-12-10' AND '2012-12-13') 
       ) AS a ON rd.roomid = a.roomid 
+0

是的,這是工作,我怎麼能加入這個查詢與room_details表? – canerkoroglu

+0

使用此查詢的輸出作爲表,並將此表與房間詳細信息一起作爲選擇* from roomdetails rd內部連接(上面的查詢)作爲rd.roomid = a.id –

+0

您能否分享完整查詢請我無法準確理解? – canerkoroglu

0

SQL BETWEEN條件將返回表達式在value1和value2(含)範圍內的記錄。因此,應爲上述查詢返回行101,2012-12-10,0

0

試試這個:

SELECT roomid 
FROM status 
WHERE 'date_from' <= "2012-12-10" AND 'date_to' > "2012-12-10" AND 'status'= 0;