【问题标题】:retrieve unique hotel id for users for booking system为预订系统检索用户的唯一酒店 ID
【发布时间】:2013-04-29 21:19:05
【问题描述】:

我有一个与 sql 相关的问题。我需要为下面描述的表编写一个复杂的查询

id  date        quantity    roomtypeid  hotelid

用户将使用入住和退房日期搜索酒店,并使用搜索查询指定房间数量(数量),所以我需要做的是从上表中获取酒店 ID,其中包含入住时可用的最少房间数量退房日期。

1   04-01-2013  3   4   10
2   04-02-2013  3   4   10
3   04-03-2013  3   4   10
4   04-04-2013  3   4   10
5   04-01-2013  3   4   11
6   04-02-2013  3   4   11
7   04-03-2013  3   4   11
8   04-04-2013  3   4   11
9   04-01-2013  3   4   12
10  04-02-2013  3   4   12

如果用户想要从 04-01-2013 到 04-03-2013 预订 3 间客房,则生成的查询应该只提供 10,11 作为酒店 ID。

问候 子目录

【问题讨论】:

  • 这个问题不是很清楚。您能否详细说明或提供更多细节。
  • 那么有什么尝试?所以你的努力。
  • 房间数量需要匹配,并且开始和结束日期之间的所有日期都必须出现在日期列中,例如如果我从第 2 天到第 4 天预订,那么房间必须为 2,3 ,4 个日期
  • 可能有三个房间可用 - 但没有证据表明从一天到下一天,三个房间都可用。每天都得搬房间让我发疯!但是,除此之外,另一种概念化您的问题的方法是查找然后排除在这些日期之间房间数量少于所需数量的任何酒店。包含所有相关日期的日历表可能对此有用。
  • 我的意思是,只有在该日期内指定房间数量最少的酒店才能被选中

标签: php mysql


【解决方案1】:
SELECT DISTINCT(`hotelid`) FROM `tableName` WHERE `date` = $checkindate AND `date` = $checkoutdate AND `quantity` = $numberofroom

使用上面的查询。它只是虚拟查询根据您修改它(字段名称和变量名称)

【讨论】:

    【解决方案2】:

    更新2

    SELECT `hotelid` 
      FROM table1
     WHERE `date` BETWEEN '2013-04-01' AND '2013-04-03'
       AND quantity >=3
     GROUP BY `hotelid`
    HAVING COUNT(*) = DATEDIFF('2013-04-03', '2013-04-01') + 1
    

    WHERE 子句中的 3 是应该可用的房间数。

    输出

    | HOTELID |
    -----------
    |      10 |
    |      11 |
    

    SQLFiddle

    【讨论】:

    • 它不起作用,因为不同房间类型 id 可能有相同的日期,并且它会影响您的计算,code (1, '2013-04-01', 3, 4, 10) , (2, '2013-04-03', 3, 4, 10), (3, '2013-04-04', 3, 4, 10), (4, '2013-04-01', 3, 4, 11), (5, '2013-04-02', 3, 4, 11), (6, '2013-04-03', 3, 4, 11), (7, '2013-04-04 ', 3, 4, 11), (8, '2013-04-01', 3, 4, 12), (9, '2013-04-02', 3, 4, 12), (10, '2013 -04-05', 3, 4, 10), (11, '2013-04-02', 3, 6, 10), (12, '2013-04-05', 3, 7, 10)@987654326 @
    • @Subash 如果您不关心房间类型,请不要在GROUP BY 中使用它。查看更新的答案和 SQLFiddle
    • 它仍然不起作用,您是在计算总和并作为一个整体检查,而不是在单个房间上,所以如果最小房间数量为 3,那么如果酒店有 1 天 1 间客房和 3 间客房第二天,那家酒店被认为是有效的,但它不是
    • @Subash 更新了答案和 sqlfiddle。 WHERE 子句中的附加条件应该处理它。
    • @Subash ... 并更改了HAVING 条件以强制日期连续
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    • 2011-01-28
    • 2019-03-02
    • 2012-03-06
    相关资源
    最近更新 更多