我正在努力解决SQL查询问题。 我正在为滑雪胜地建立一个预订系统,在我的数据库中我有导师和会议。会话可以有一个教师,它有一个日期和startTime和endTime。 为了添加会话,我希望在选定的时间和日期获得所有可用的教师。换句话说,所有在那个日期和那个时间都没有预订的教师。 表示例:
e.g 教练: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
想出我需要将加入会话留给教师,按教师ID分组,然后消除那些在选定组中有字段的ID 投入。但是,对于GROUP BY子句,我必须使用聚合函数,我不知道哪一个可以在这里应用。
答案 0 :(得分:0)
使用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'
)
答案 1 :(得分:0)
所以我尝试了这个查询,显然它起作用(至少对我的测试用例而言)
任何人都可以看看并告诉我它看起来是否正确?
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') )
答案 2 :(得分:0)
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窗口重叠的会话预订的教师。
如果这是他们想要的,那么你很高兴。当然,并不是说导师是真的可用&#34;。可能存在影响其可用性的其他因素(工作时间,年假等),因此您需要确保有适当的事情来处理这些事情。
另请注意,此代码会阻止教师出现&#34;背靠背&#34;预订。如果您希望在另一个结束时允许预订从14:30开始,则您需要将<=
和>=
更改为<
和{{ 1}}。