将多个房间可用性查询合并为一个

时间:2011-02-11 14:31:19

标签: mysql query-optimization

我目前正在尝试通过组合查询来优化数据库。但是,在优化房间可用性查询的同时,我一直在努力达到目的。

我有一个房间可用性表,其中每个记录都说明了每个日期的可用房间数。它的格式如下:

  • room_availability_id(PK)
  • room_availability_rid(fk_room_id)
  • room_availability_date(2011-02-11)
  • room_availability_number(可用房间数)

麻烦的是获得每个提供的日期可用的房间列表。当我像这样使用IN()时:

WHERE room_availability_date IN('2011-02-13','2011-02-14','2011-02-15')
AND room_availability_number > 0

如果14号有可用性0,它仍然给我其他2个日期。但是我只想在所有三个日期都有这个room_id。

请告诉我除了单独查询每个日期/房间/可用性组合之外,还有一种方法可以在MySQL中执行此操作(现在就是这样做了:-()

我尝试了各种组合,尝试使用room_availability_date = ALL(...),尝试了一些脏的重复子查询,但无济于事。

提前感谢您的任何想法!

3 个答案:

答案 0 :(得分:4)

您需要构建一个查询以对房间ID进行分组,然后检查每个日期是否有可用性,这可以使用having子句来完成。将where子句谓词保留为room_availability_date将有助于保持查询的有效性(因为索引等不能轻易地与having子句一起使用)。

SELECT 
    room_availability_rid

WHERE room_availability_date IN ('2011-02-13','2011-02-14','2011-02-15')
  AND room_availability_number > 0

GROUP BY room_availability_rid 

HAVING count(case room_availability_date when '2011-02-13' THEN 1 END) > 0
   AND count(case room_availability_date when '2011-02-14' THEN 1 END) > 0
   AND count(case room_availability_date when '2011-02-15' THEN 1 END) > 0

答案 1 :(得分:3)

我想我可以改进一个答案:

SELECT 
    room_availability_rid, count(*) n

WHERE room_availability_date IN ('2011-02-13','2011-02-14','2011-02-15')
  AND room_availability_number > 0

GROUP BY room_availability_rid 

HAVING n=3

编辑:这当然假设每个房间每天只有一个表项。这是一个有效的假设吗?

答案 2 :(得分:1)

您可以按房间ID分组,生成可用日期列表,然后查看是否包含您需要的所有日期。

这将为您提供每个房间可用的日期列表:

select `room_availability_rid`,group_concat(`room_ availability_date`) as `datelist`
       from `table` where room_availability_number>0 
       group by `room_availability_rid`

然后我们可以添加一个having子句来获取我们需要的所有日期都可用的房间:

select `room_availability_rid`,group_concat(`room_ availability_date`) as `datelist`
        from `table` where room_availability_number>0
        group by `room_availability_rid`
        having find_in_set('2011-02-13',`datelist`) and
               find_in_set('2011-02-14',`datelist`) and
               find_in_set('2011-02-15',`datelist`)

这应该有效。我会测试一下吗? :)