【问题标题】:mysql query room availabilitymysql查询房间可用性
【发布时间】:2011-02-23 13:24:41
【问题描述】:

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

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

【问题讨论】:

    标签: mysql sql mysql-error-1242


    【解决方案1】:
    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`
    

    【讨论】:

    • 哈哈,在我看到你的帖子之前就意识到 IF 位被破坏了,但是我更喜欢你的 JOIN 解决方案,并且显然可以很好地处理多个连接 :) 谢谢!
    【解决方案2】:

    错误消息指的是查询末尾的IF(($q1) &gt; 0, 1, 0) 子句。如果子查询返回多行,则不能将子查询与 &gt; 进行比较。

    【讨论】:

      猜你喜欢
      • 2014-07-14
      • 2016-08-12
      • 2019-07-16
      • 2013-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-23
      相关资源
      最近更新 更多