到目前为止,我已经看过其他一些mysql可用性查询问题,但到目前为止,我的工作方式与其他方式略有不同。
基本上我有一个日期表,每个日期都是一行。每行都包含用于说明费用,房型以及该日期必须预订的天数的字段。因此,如果酒店有1种房型,它将有365行;如果有5种房型,那么它将有1825行
bd_id int(10) NO PRI NULL auto_increment bd_room_type varchar(32) bd_date date NO bd_price decimal(8,2) bd_h_id int(8) NO /* Hotel id */ bd_available tinyint(1) /* number of days you must book to include this date */
我获得了从和到的日期,并填补了两者之间的空白,因此我拥有了所有的预订日期。
$q1 = "SELECT bd_h_id FROM booking_dates WHERE bd_date IN ('2011-02-16','2011-02-17','2011-02-18') AND bd_available <= '3' AND bd_room_type = 'single' AND bd_price > '0' GROUP BY bd_h_id HAVING count(*) = '3'";
因此,如果计数与持续时间相同,则意味着已满足所有依赖性,并且可以在搜索中显示结果。
然后,我将该查询作为变量传递给另一个查询,该查询提取酒店信息,检查子查询是否返回任何内容。
$q = "SELECT c_title FROM c_content WHERE c_id IN ($q1) AND IF(($q1) > 0, 1, 0)";
很好,但是如果子查询返回的酒店多于1家,则主查询给我以下错误:
子查询返回1行以上
我以为,因为我用了“ IN”就可以了。有什么建议?同样,当我打算实现多个子查询时,该解决方案也需要与此一起工作。
我知道我的房间制作方式并不尽如人意,但是我不确定如何再达到所需的效果,因为预订通常是批量预订(例如,超过一个房间预订)一次,如果在提供的日期内没有一种房型,则需要从搜索结果中删除整个酒店)。
IF(($q1) > 0, 1, 0)
这是返回错误的部分。
此外,您对它的方式$q1也将进行两次评估,这可能不是您想要的。
$q1
如果我正确理解了您要做什么,那么您应该可以省去这部分内容。如果不$q1返回任何行,则该IN表达式根本不匹配任何内容。
IN
还应该注意的是,IN在MySQL中使用子查询效率很低。使用join将运行得更快:
SELECT `c_title` FROM `c_content` JOIN ($q1) `a` ON `c_content`.`c_id`=`a`.`bd_h_id`