我目前正在尝试通过组合查询来优化数据库。但是,在优化房间可用性查询的同时,我一直在努力达到目的。
我有一个房间可用性表,其中每个记录都说明了每个日期的可用房间数。它的格式如下:
麻烦的是获得每个提供的日期可用的房间列表。当我像这样使用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(...),尝试了一些脏的重复子查询,但无济于事。
提前感谢您的任何想法!
答案 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`)
这应该有效。我会测试一下吗? :)