我是php,mysql以及互联网的新手。我有一个问题,我怀疑多个选择可能解决也可能不解决。如果你不认为这是最好的办法,不论它的表格声明或其他任何事情让我知道,我有3张桌子。
因此可以推断出几个住宿可以列在一个酒店下面。例如。小型套房,豪华间等 每个住宿也有不可用的日期。 我想要实现的是,当用户输入日期范围时,只要它与特定住宿的“Unavailable_dates”中的一个记录匹配,它就不会返回该住宿
|-id-| accommodation_id | start | end |
|-1--|-----2------------|--12/02/12--|-20/02/12--|
|-2--|-----2------------|--07/03/12--|-26/03/12--|
我想要达到的目标是,如果我的日期是在第一个记录范围而不是第二个记录范围,那么非将返回,因为选择返回第二个。 下面是一些额外的细节,可能有助于帮助我不断阅读它,除非你想要额外的细节。
额外详情
SELECT location.*, accommodation.*
FROM location
JOIN (accomodation, Unavailable_dates)
ON (location.id = accommodation.location_id
AND accommodation.id = unavailable_date.accommodation_id)
WHERE location.city='Birmingham'
AND 'check_in_date' NOT BETWEEN hotel_dates.start AND hotel_dates.end
AND 'check_out_date' NOT BETWEEN hotel_dates.start AND hotel_dates.end
如果我的check_in_date介于第一条记录的开始日期和结束日期之间,并且我的check_out_date介于第二条记录的开始日期和结束日期之间,则不会返回任何项目。哪个没问题,但如果我的入住日期在第一个记录的开始和结束日期之内,但我的结账日期不在我的第二个记录之间,那么它将返回住宿。
答案 0 :(得分:1)
根据我的理解,您需要一系列可用的住宿。现在,根据您所获得的数据结构,即不可用的日期,通过调整查询来查找不可用的住宿将更容易,如下所示:
无法住宿
SELECT DISTINCT accommodation.id
FROM location
JOIN (accomodation, Unavailable_dates)
ON (location.id = accommodation.location_id
AND accommodation.id = unavailable_date.accommodation_id)
WHERE location.city='Birmingham'
AND ('check_in_date' BETWEEN hotel_dates.start AND hotel_dates.end
OR 'check_out_date' BETWEEN hotel_dates.start AND hotel_dates.end)
一旦你得到一个不可用的住宿清单,它就可以直接获得:
可用住宿
SELECT location.*, accommodation.*
FROM location
JOIN (accomodation, Unavailable_dates)
ON (location.id = accommodation.location_id
AND accommodation.id = unavailable_date.accommodation_id)
WHERE location.city='Birmingham'
AND accomodation.id not in
(SELECT DISTINCT accommodation.id
FROM location
JOIN (accomodation, Unavailable_dates)
ON (location.id = accommodation.location_id
AND accommodation.id = unavailable_date.accommodation_id)
WHERE location.city='Birmingham'
AND ('check_in_date' BETWEEN hotel_dates.start AND hotel_dates.end
OR 'check_out_date' BETWEEN hotel_dates.start AND hotel_dates.end))
PS:检查您可能想要应用的语法和其他条件。
此查询可以进一步优化,但我想说的是,您可以根据可用数据做出决策,然后调整它以获得所需的结果。
希望这是有道理的。
答案 1 :(得分:0)
尝试这个:
SELECT location.*, accommodation.*
FROM location
JOIN (accomodation, Unavailable_dates)
ON (location.id = accommodation.location_id
AND accommodation.id = unavailable_date.accommodation_id)
WHERE location.city='Birmingham'
AND (('check_in_date' NOT BETWEEN hotel_dates.start AND hotel_dates.end)
OR ('check_out_date' NOT BETWEEN hotel_dates.start AND hotel_dates.end))