多选查询MySQL

时间:2012-02-27 20:09:43

标签: mysql select join

我是php,mysql以及互联网的新手。我有一个问题,我怀疑多个选择可能解决也可能不解决。如果你不认为这是最好的办法,不论它的表格声明或其他任何事情让我知道,我有3张桌子。


|酒店|

  • ID
  • hotel_title
  • 标题
  • 国家/地区

|住宿|

  • ID
  • LOCATION_ID
  • 标题
  • 尺寸
  • en suite

| Unavailable_dates |

  • ID
  • accommodation_id
  • 启动
  • 结束

因此可以推断出几个住宿可以列在一个酒店下面。例如。小型套房,豪华间等 每个住宿也有不可用的日期。 我想要实现的是,当用户输入日期范围时,只要它与特定住宿的“Unavailable_dates”中的一个记录匹配,它就不会返回该住宿

例如

| 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介于第二条记录的开始日期和结束日期之间,则不会返回任何项目。哪个没问题,但如果我的入住日期在第一个记录的开始和结束日期之内,但我的结账日期不在我的第二个记录之间,那么它将返回住宿。

2 个答案:

答案 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))