在这里查看了一些其他的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'就可以了。有什么建议?此外,当我开始实现多个子查询时,解决方案也需要使用它。
我知道我在做房间的方式并不尽可能优雅,但是我不确定如何达到我需要的结果,因为预订通常是批量预订(例如不止一次)一次预订的房间,如果在提供的日期内没有一种房型,则需要从搜索结果中删除整个酒店。
答案 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)
子句。如果子查询返回多行,则无法将子查询与>
进行比较。