我正在为SQL查询而挣扎。我正在为一个滑雪胜地建立一个预订系统,在我的数据库中,我有教练和课程。一个会话可以有一个指导员,它有一个日期、startTime和endTime。为了增加一节课,我想让所有可用的讲师在选定的时间和日期。换句话说,所有在那个日期和那个时候没有预约的老师。表例:
讲师: i1,i2,i3,i4,i5,i6,i7,i8
会议:
讲师,日期,开始,结束,结束
**i1** **2017-05-03** **14:30:00** **15:30:00**
**i2** **2017-05-03** **14:30:00** **15:30:00**
**i3** **2017-10-03** **10:30:00** **11:30:00**
**i4** **2017-05-03** **10:30:00** **11:30:00**
**i1** **2017-11-03** **14:30:00** **15:30:00**然后输入日期=‘2017-05-03’,开始=‘14:30’和结束=‘15’30‘我想得到
i3,i4,i5,i6,i7,i8
计算出我需要将join会话留给指导员,按指导员id分组,然后消除那些在组中有一个字段的id和所选的输入。但是,对于GROUP子句,我必须使用聚合函数,我不知道在这里可以应用哪一个函数。
发布于 2017-03-19 10:31:18
SirWinning的自我回答看起来应该有效,但我下面的版本删除了一些不需要的部分。
select *
from instructor
where id not in
(select instructorid
from Session
where date='2017-03-19' and starttime<='15:30:00' and endtime>='14:30:00')此代码将找到任何未预订课程的讲师,该课程与相关日期的14:30-15:30窗口重叠。
如果这是你想要的,那你就可以走了。当然,这并不意味着指导员是“真正可用的”。还有其他事情会影响他们的工作效率(工作时间、年假等),所以你需要确保有合适的事情来处理这些事情。
还要注意,这段代码将防止指导员出现在“背靠背”的预订中。如果您想让预订在14:30开始,而另一次预订在那个时候结束,则需要将<=和>=更改为<和>。
发布于 2017-03-18 22:40:22
使用not exists()
select *
from instructors i
where not exists (
select 1
from sessions s
where s.instructor = i.id
and s.date = '2017-05-03'
and s.start = '14:30'
and s.end = '15:30'
)发布于 2017-03-18 23:47:29
所以我尝试了这个查询,显然它有效(至少对我的测试用例是这样)
有人能看一下并告诉我看上去是否正确吗?
select *
from instructor
where id in
(select id
from instructor
group by id
having id not in
(select distinct(instructorid) from Session
where date='2017-03-19' and starttime<='15:30:00' and endtime>='14:30:00') )https://stackoverflow.com/questions/42880617
复制相似问题