2016-11-08 32 views
1

我有臺這樣的:如何找到具有2個連續五天預訂之間的空閒時隙的第一個房間

room_id  date_reservartion 
101   October, 01 2016 
101   October, 03 2016 
102   October, 02 2016 
102   October, 05 2016 
103   October, 01 2016 
103   October, 02 2016 
103   October, 04 2016 
104   October, 04 2016 

我試圖找到第一個房間裏有免費雙天的免費行。

在這種情況下的答案是房間102因爲有保留2-10-2016和5-10-2016,3-10和4-10是免費的。 你能幫我嗎?

鏈接SQL Fiddle

+0

有趣的標題:-) – Bugfixer

+0

口號槓桿交易:) – starko

回答

0

我分享我的兩個方法。

方法1:

SELECT 
    a.room_id 
FROM 
    booking a 
INNER JOIN booking b ON a.room_id = b.room_id 
AND a.date_reservartion < b.date_reservartion 
WHERE 
    NOT EXISTS (

     SELECT 
     * 
     FROM booking c 
     WHERE c.room_id = a.room_id 
     AND c.date_reservartion BETWEEN 
       (a.date_reservartion + INTERVAL 1 DAY) AND 
       (b.date_reservartion - INTERVAL 1 DAY) 
) 
AND DATEDIFF(b.date_reservartion,a.date_reservartion) = 3 
ORDER BY a.date_reservartion 
LIMIT 1 

方法2:

這裏的另一種方式,您可以使用MySQL user defined variables實現這一目標。

SELECT 
a.room_id 
FROM 
(
    SELECT 
    *, 
    IF(@prevRoom = room_id, @rn := @rn + 1, 
     IF(@prevRoom := room_id, @rn := 1, @rn := 1) 
    ) AS rn 
    FROM booking 
    CROSS JOIN (SELECT @prevRoom := 0, @rn := 1) AS var 
    ORDER BY room_id, date_reservartion 
)AS a 
INNER JOIN 
(
    SELECT 
    *, 
    IF(@prevRoom2 = room_id, @rn2 := @rn2 + 1, 
     IF(@prevRoom2 := room_id, @rn2 := 1, @rn2 := 1) 
    ) AS rn 
    FROM booking 
    CROSS JOIN (SELECT @prevRoom2 := 0, @rn2 := 1) AS var 
    ORDER BY room_id, date_reservartion 
) AS b 

ON a.room_id = b.room_id AND a.rn = b.rn+1 
WHERE DATEDIFF(a.date_reservartion,b.date_reservartion) = 3 

SEE DEMO

注:

如果你只需要那種的第一個自由空間,就在上面的查詢中添加以下兩行:

ORDER BY a.date_reservartion 
LIMIT 1 
+0

偉大的決心。謝謝! – starko

1

請試試這個。

Select top 1 * from (
    Select a.room_id,DATEDIFF(DAY,a.date_reservartion,b.date_reservartion)-1 as Diff 
    FROM room as a 
    INNER JOIN room as b on a.room_id=b.Room_id 
) as t Where Diff = 2 
Order by room_id 

它顯示102看看..

enter image description here

+0

這會挑'ROOM_ID = 103'最終結果了。 – 1000111

+0

我只需要room_id = 102 – starko

+0

如果您刪除top 1,那麼它會向您顯示所有房間空置2天,因爲我們已經按順序顯示它。 – Husen

0

嘗試這個

Select top 1 a.room_id,DATEDIFF(DAY,a.date_reservartion,b.date_reservartion)-1 as Diff 
     FROM room as a 
      INNER JOIN room as b on a.room_id=b.room_id Where Diff = 2 Order by a.room_id 
0

每個房間在2016-10-05之後都是免費的,這裏有一個sql可以顯示房間空閒兩天的時間。您可以輕鬆修改它以查看任何空閒時間(+ N時間間隔)。如果您申請限制1,您將看到第一個免費房間。

select 
    room_id, 
    date_reservartion + interval 1 day AS from_date, 
    date_reservartion + interval 2 day AS to_date 
from booking as b 
where not exists (
    select 1 
    from booking as b2 
    where b2.room_id = b.room_id 
    and b2.date_reservartion >= b.date_reservartion + interval 1 day 
    and b2.date_reservartion <= b.date_reservartion + interval 2 day 
) 

order by from_date ASC 
0

請嘗試這個

SELECT top 1 room_id 
    FROM (SELECT a.*, (b.date_reservartion - a.date_reservartion - 1) diff 
      FROM (SELECT ROW_NUMBER() OVER (ORDER BY room_id) rn, room_id, 
         date_reservartion 
        FROM booking) a inner join 
       (SELECT ROW_NUMBER() OVER (ORDER BY room_id) rn, room_id, 
         date_reservartion 
        FROM booking) b 
     On a.room_id = b.room_id AND a.rn = b.rn - 1) t 
WHERE diff = 2 

它顯示102

相關問題