【问题标题】:MySQL find first available weekendMySQL 找到第一个可用的周末
【发布时间】:2011-04-15 13:47:36
【问题描述】:

我有一张用于预订餐厅的桌子。它只有一个 restaurant_id 和一个 date 列,用于指定实际日期(我们说的是全天预订)。

我想知道特定餐厅的下一个周末什么时候有空。 “周末”是星期六或星期日。如果其中一个可用,那么我们有一个可用的周末。

查询当然应该考虑当前时间来计算下周末。

谁能帮忙?

以下是“日期”表的表结构和数据,该表包含迄今为止的所有预订:

id    id_venue    date  
12    1           2011-04-22  
13    1           2011-04-23  
14    1           2011-04-24  
15    1           2011-04-30  
16    1           2011-05-07  
17    1           2011-05-08

如您所见,23 日至 24 日的周末已满,因此 5 月 7 日至 8 日是周末。我需要找到 2001-05-01 的日期,这是今天日期之后的第一个星期六或星期日。

【问题讨论】:

    标签: php mysql date


    【解决方案1】:

    我认为其他人错过了这个问题...他们认为您的桌子可能已经填充了所有周末以及一些打开与否的状态...我的猜测是您的桌子只有在保留时才有记录...因此您需要找到根本不存在的记录...根据一些自动查找日期...

    这是我对另一篇帖子的修改here

    虽然我没有更改查询的上下文,但我只放入了与您的表关联的列。我知道你只针对一个场地表,我也是(实际上)。但是,为了理解“JustDates”别名,这个 INNER PRE-QUERY 通过对任何其他表进行笛卡尔连接来创建一个动态填充的 ALL DATES 表。在这种情况下,您的“Venue”预订表(我没有看不到你的实际表名引用,所以你必须改变它)。因此,这实质上创建了一个从“今天”开始的所有日期的表格,并持续 30 天(通过限制),但可以是 40、50、300 或您需要的任意数量.. 提供“YourVenueTable”至少有与您要测试的天数一样多的记录。 (在帖子中对此进行了同样的澄清)。这个结果集在 30 天、40 天或多天后仅针对给定的 1-Sunday 或 7-Saturday 的星期几进行预过滤...因此它应该返回仅包含 Apr 23、Apr 24、Apr 的结果集30、5月1日、5月7日、5月8日、5月14日、5月15日、5月21日、5月28日等

    所以现在您有一个动态创建的结果集,包含您正在考虑向前推进的所有可能日期。现在,它被加入到您的实际场地预订表中,并被过滤为仅返回您关注的 id_venue 未找到的日期。在您的数据示例中,它将在 4 月 23 日和 24 日找到匹配项,并且不会返回这些记录。与 4 月 30 日相同...但是,它会发现资格预审列表中包含 5 月 1 日的记录将不会在场地表中找到日期匹配,因此会按照您的预期将其包含在内...然后它将继续跳过5 月 7 日和 8 日,然后返回 5 月 14 日、15 日、21 日、28 日等...

    select JustDates.OpenDate
      from 
          ( select
             @r:= date_add( @r, interval 1 day ) OpenDate
          from
             ( select @r := current_date() ) vars,
             Venue 
          LIMIT 30 ) JustDates
       where
          DAYOFWEEK( JustDates.OpenDate ) IN ( 1, 7 )
          AND JustDates.OpenDate NOT IN
              ( select Venue.date
                    from Venue
                    where Venue.id_venue = IDYouAreInterestedIn
                      and Venue.Date = JustDates.OpenDate )
        order by 
           JustDates.OpenDate
    

    注意,根据其他预订发布,对预订日期可用性日期的查询限制为 30 以上可以是系统中的任何表,只要它至少有您希望的天数预订...如果您想要下一年的所有可用性,您会希望表中用于笛卡尔结果的 365 条记录让 @r 在动态创建的“日期”记录中循环。

    【讨论】:

    • 您似乎最了解我需要获得的东西。我只需要在一张桌子上工作:保留预订的那张。此表仅包含餐厅被保留的日期。所以我需要获取表中不存在的日期。我已经设法获得了第一个可用的周末(周六或周日),但在最后一次预订之后,但我需要非常第一个可用日期,这可能比最后一次预订早。
    • @Zorrocaesar,这正是我正在做的......我已经修改了帖子以澄清......此外,如果你只接受 INNER PRE-QUERY 我指的是返回只是日期,您将看到动态列表是如何填充的,然后将该结果重新加入您的场地表以查找场地预订中未找到的日期。
    • 您的查询返回错误:#1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 8 行的 'WHERE DAYOFWEEK(@r) in (1, 7) ) JustDates where ' 附近使用正确的语法
    • @Zorrocaesar,我已经调整过了,它可以工作了。您只需要重新同步您感兴趣的表名和 ID_Venue ID,以防它作为参数或其他东西进来......与 LIMIT 命令相同,用于预测您预计的天数。
    【解决方案2】:
    SELECT ...... DAYOFWEEK(`date`) as `num` FROM .... WHERE  num = 1 OR num = 7
    

    我不知道你想如何检查“可用性”

    【讨论】:

      【解决方案3】:

      怎么样?

      SELECT * FROM table WHERE (DAYOFWEEK(date)=1 OR DAYOFWEEK(date)=7) AND restaurant_id =$RESTAURANTID AND date >  CURDATE() ORDER BY date ASC LIMIT 1
      

      【讨论】:

        【解决方案4】:

        设置从今天到下一个星期六的天数(如果为 0 则今天是星期六) 假设如果今天是星期天,您只想预订下一个整个周末。

        select @OffsetSaterday:= mod((8-DayOfWeek(CurDate())+7,7);
        

        您没有提供足够的信息来了解预订数据库的外观,所以我在这里猜测一下。

        每家餐厅都有座位:

        Table seats
          id: integer primary key
          rest_id: integer  #link to restaurant
          desc: varchar(20) # description of the seat.
        
        Table restaurant
          id: integer primary key
          other fields.....
        
        Table Reservation
          id: integer primary key
          reservation_date: date
          seat_id: integer
        

        获取下周末所有可用座位的选择语句是:

        select @OffsetSaterday:= mod((8-DayOfWeek(CurDate())+7,7);
        select s.*, rst.* from seats s
          inner join restaurant rst on (rst.id = seats.rest_id)
          left join r on (r.seat_id = s.id 
            and r.reservation_date between 
              date_add(curdate(),interval @OffsetSaterday day) and
              date_add(curdate(),interval @OffsetSaterday+1 day)
        where r.id is null
        order by s.rest_id, s.desc;
        

        您也许可以将两个选择合二为一,但 MySQL 不保证表达式被评估的顺序,所以我不建议这样做。

        【讨论】:

        • 听起来发布问题的人正在做婚礼或其他此类宴会聚会之类的事情,正在寻找适合此类宴会聚会的整个餐厅/设施。您的查询明确地只寻找一个周末的座位。他们正在寻找可能可用的东西。你不知道是 1 周、3 周、8 周还是 16 周......他们想知道这个地方什么时候有空。
        • 不得不做出一些猜测,这个问题是关于信息的。除此之外,我认为没有必要走其他人已经回答过的道路。
        • 我相信我发布的版本可以正常工作,但还没有收到回复(显然),因为我已经完成了几乎相同考虑的其他帖子。您的版本肯定更接近,因为您动态地提供 MySQL 变量计算基础。其他人只是在寻找符合条件的现有记录...这些是餐厅预订的日期,而不是开业时间...
        猜你喜欢
        • 1970-01-01
        • 2018-09-12
        • 1970-01-01
        • 2020-03-30
        • 2021-08-21
        • 2019-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多