我分享我的兩個方法。
方法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
有趣的標題:-) – Bugfixer
口號槓桿交易:) – starko