小编典典

mysql查询室可用性

sql

到目前为止,我已经看过其他一些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”就可以了。有什么建议?同样,当我打算实现多个子查询时,该解决方案也需要与此一起工作。

我知道我的房间制作方式并不尽如人意,但是我不确定如何再达到所需的效果,因为预订通常是批量预订(例如,超过一个房间预订)一次,如果在提供的日期内没有一种房型,则需要从搜索结果中删除整个酒店)。


阅读 167

收藏
2021-04-15

共1个答案

小编典典

IF(($q1) > 0, 1, 0)

这是返回错误的部分。

此外,您对它的方式$q1也将进行两次评估,这可能不是您想要的。

如果我正确理解了您要做什么,那么您应该可以省去这部分内容。如果不$q1返回任何行,则该IN表达式根本不匹配任何内容。

还应该注意的是,IN在MySQL中使用子查询效率很低。使用join将运行得更快:

SELECT `c_title` FROM `c_content` JOIN ($q1) `a` ON `c_content`.`c_id`=`a`.`bd_h_id`
2021-04-15