0

到目前为止,我已经查看了这里的一些其他 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”就可以了。有什么建议么?此外,当我着手实现多个子查询时,解决方案也需要使用它。

我知道我做房间的方式并不像它应该的那样优雅,但是我不确定如何才能达到我需要的结果,因为预订通常是批量预订(例如,在一次,如果在提供的日期内没有一种房间类型,则需要从搜索结果中删除整个酒店)。

4

2 回答 2

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

这是返回错误的部分。

此外,您拥有它的方式$q1正在被评估两次,这可能不是您想要的。

如果我正确理解您要执行的操作,那么您应该可以将这部分排除在外。如果$q1不返回任何行,则IN表达式根本不会匹配任何内容。

还应该注意,IN在 MySQL 中使用子查询是相当低效的;加入连接会运行得更快:

SELECT `c_title` FROM `c_content` JOIN ($q1) `a` ON `c_content`.`c_id`=`a`.`bd_h_id`
于 2011-02-23T13:29:26.393 回答
0

错误消息指IF(($q1) > 0, 1, 0)的是查询末尾的子句。>如果子查询返回多行,则无法将其与子查询进行比较。

于 2011-02-23T13:32:17.280 回答