我创建了一个简单的查询,试图找出特定天数内的别墅是免费的(checkin_date和checkout_date)。
但是现在我想到了我不认为我的下面的查询会返回正确的结果:
SELECT DISTINCT default_villa_type
FROM villa, reservation
WHERE villa.villa_type = reservation.default_villa_type
and res_checkin_date not between '2011-12-21' and '2011-12-23'
and res_checkout_date not between '2011-12-21' and '2011-12-23'
我需要使用查询:
别墅表格包含以下栏目:
(villa_id, phone_ext, villa_type, no_of_rooms, no_of_beds, default_price_plan)
包含以下列的预订表:
(confirm_no, credit_card_no, res_checkin_date, res_checkout_date, default_villa_type, price_plan)
我不相信它正确地使用两个表来确定哪些类型的别墅在查询中的日期仍然可用,但我可能错了我需要一双新眼睛来看看它。
答案 0 :(得分:2)
您可以尝试找到所有不首先免费的别墅,因为您没有代表免费别墅的记录,而只是代表不是免费别墅的记录。
SELECT villa_id
FROM villa
WHERE villa_type NOT IN (
SELECT default_villa_type
FROM reservation
--reservations starting within range
WHERE res_checkin_date > '2011-12-21'
AND res_checkin_date < '2011-12-23'
--reservations starting before range and ending after range
OR (
res_checkin_date <= '2011-12-21'
AND res_checkout_date > '2011-12-21'
)
--reservations ending within range
OR (
res_checkout_date > '2011-12-21'
AND res_checkout_date < '2011-12-23'
)
)
另一种方式,根据Mikael的评论,可以是:
SELECT villa_id
FROM villa
WHERE villa_type NOT IN (
SELECT default_villa_type
FROM reservation
WHERE res_checkin_date < '2011-12-23'
AND res_checkout_date > '2011-12-21'
)
我还建议您使用变量而不是静态字符串日期。