MySQL找到第一个可用周末

问题描述

| 我有一张桌子,可以预订餐厅。它只有一个restaurant_id和一个date列,它们指定实际日期(我们正在谈论全天预订)。 我想知道下一个餐厅的下个周末是什么时候。 “周末”是星期六或星期日。如果其中一个可用,那么我们有一个周末。 当然,查询应考虑当前时间以计算下一个周末。 有人可以帮忙吗? 这是\“ dates \”表的表结构和数据,其中包含到目前为止进行的所有保留:
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,这是今天日期之后的第一个可用的星期六或星期日。     

解决方法

我认为其他人都没有回答这个问题...他们认为您的桌子可能已经在整个周末都被摆放了,并且某些状态是否可以打开...我的猜测是,如果保留了您的桌子,则只有一个记录...因此,您需要根据一些自动查找日期来查找根本不存在的记录... 这是我在这里所做的另一篇文章的修改 尽管我没有更改查询的上下文,但只放入了与您的表关联的列。我了解到您只不过是反对一个场地表,我(实际上)也是。但是,要了解\“ JustDates \”别名,此INNER PRE-QUERY通过对任何其他表进行笛卡尔连接来创建ALL DATES的动态填充表。在这种情况下,您的\“ Venue \”保留表(我没有明确看到您的实际表名引用,因此您必须进行更改)。因此,从本质上讲,这将创建一个表格,其中包含从“今天”开始的所有日期,并持续30天(通过限制),但可以是40、50、300或您需要的任意多个。 “ YourVenueTable \”至少具有要测试的天数的记录。 (与此相同的澄清来自于此)。仅在1周日或7周六的一周中的给定日期对30、40或许多天的结果集进行预过滤...因此,它应仅返回4月23日,4月24日,4月的结果集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天,则查询的预订日期可利用日期的限制为30以上,可以是系统中的ANY表。 。如果希望下一年度的所有可用性,则希望用于笛卡尔结果的表中的365条记录可以通过动态创建的“ date”记录获得@r循环。     ,
SELECT ...... DAYOFWEEK(`date`) as `num` FROM .... WHERE  num = 1 OR num = 7
我不知道您要如何检查“可用性”     ,怎么样?:
SELECT * FROM table WHERE (DAYOFWEEK(date)=1 OR DAYOFWEEK(date)=7) AND restaurant_id =$RESTAURANTID AND date >  CURDATE() ORDER BY date ASC LIMIT 1
    ,设置从今天到下一个Saterday的天数(如果为0,则今天为Saterday) 假设如果今天是星期天,则只需要下一个完整周末的预订。
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不保证表达式的求值顺序,因此我建议不要这样做。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...