mysql查询室可用性

时间:2011-02-23 13:24:42

标签: mysql sql mysql-error-1242

在这里查看了一些其他的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'就可以了。有什么建议?此外,当我开始实现多个子查询时,解决方案也需要使用它。

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

2 个答案:

答案 0 :(得分: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`

答案 1 :(得分:0)

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