2016-08-04 37 views
0

我是一名学生,试图设计一个系统,可以在特定时间和日期找到所有空房间,给定教授们根据他们学校现有的数据库进行安排。 对于每个房间,计划从7:30:00 - 19:30:00(增量00:30:00)生成到名为'room_schedule'的表格。每个房间的时间表由room_id引用,来自另一个表'room_details'。另一方面, 桌子'room_details'被链接到表'prof_schedule'按房间。教授的日程安排记录在现有的“prof_schedule”表上。如何从表A中选择与表B不匹配的行(使用基于表B的时间范围)

这里的表看起来怎么样

 
    TABLE 'room_schedule' 

    day time_start time_end room_id 
    MWF 07:00:00 07:30:00 36 
    MWF 07:30:00 08:00:00 36 
    MWF 08:00:00 08:30:00 36 
    MWF 08:30:00 09:00:00 36 
    MWF 09:00:00 09:30:00 36 
    MWF 09:30:00 10:00:00 36 
    MWF 07:00:00 07:30:00 37 
    MWF 07:30:00 08:00:00 37 
    MWF 08:00:00 08:30:00 37 
    MWF 08:30:00 09:00:00 37 
    MWF 09:00:00 09:30:00 37 
    MWF 09:30:00 10:00:00 37 

    TABLE 'room_details' 
    room_id  room_name  room  
    36   Biology Room 309 
    37   Physics Room 307 


    TABLE 'prof_schedule' 
    sched_id professor  Day room time_start time_end subj 
    1   Jeffrey Smith MWF 309  8:00:00  9:30:00  Biology 
    2   Ben Williams MWF 307  8:30:00  10:00:00 Physics 

从教授的时间表基于,我想要的结果对于空置房是这样

 
RESULT vacant rooms 
     day time_start time_end room_name 
     MWF 07:00:00 07:30:00 Biology Room 
     MWF 07:30:00 08:00:00 Biology Room 
     MWF 09:30:00 10:00:00 Biology Room 
     MWF 07:00:00 07:30:00 Physics Room 
     MWF 07:30:00 08:00:00 Physics Room 
     MWF 08:00:00 08:30:00 Physics Room 

我曾尝试下面的查询,但它好像删除了'room_schedule'中的所有记录,其中time_start和time_end来自'prof_schedule'

SELECT day, time_start, time_end, room_name 
FROM room_details AS rd 
INNER JOIN room_schedule AS rs 
ON rd.room_ID=rs.room_ID 
WHERE (
    (time_start NOT IN(SELECT time_start FROM prof_schedule)) AND 
    (time_end NOT IN (SELECT time_end FROM prof_schedule)) AND 
    (rs.day NOT IN (select day from prof_schedule)) AND 
    (rs.room_id NOT IN (SELECT DISTINCT rd.room_ID from room_details AS rd 
    INNER JOIN prof_schedule AS ps on rd.room=ps.room)) 
) 

有人可以提出一个查询,显示我提到的结果吗?

P.S. 第三个表(prof_schedule)的设计需要保留,因为它们将从现有系统导入到我正在设计的系统中。

+0

如果我们知道,每个房间可以在半小时插槽从7点30分零零秒预订 - 19:30:00,那么我们真的不需要room_schedule表。我们只需知道房间何时不可用。 – Strawberry

+0

我明白了。感谢您的回复......是否意味着我错误地使用了room_schedule表?哈哈。我已经看到了一些类似于你所说的帖子。但是让我们假设我删除了room_schedule表,然后房间A将用于MWF,从8:00 - 9:00,我将如何显示房间A将从7:30至8:00以及剩下的几小时('19:30)每MWF? – dissidianUltima

+0

MWF是“星期一,星期三和星期五”? – Strawberry

回答

-1

尝试这样的事情,让我知道。

SELECT a.day, a.time_start, a.time_end, b.room_name 
FROM `room_schedule` a 
INNER JOIN `room_details` b ON a.room_id = b.room_id 
INNER JOIN `prof_schedule` c ON b.room = c.room AND 
IF(a.time_end > c.time_start, a.time_start >= c.time_end, a.time_start < c.time_start) 

尝试使用GROUP BY条款这样

SELECT a.*, b.room_name 
FROM `room_schedule` a 
INNER JOIN `room_details` b ON a.room_id = b.room_id 
INNER JOIN `prof_schedule` c ON b.room = c.room AND 
IF(a.time_end > c.time_start, a.time_start >= c.time_end, a.time_start < c.time_start) 
GROUP BY a.room_id, a.time_start, a.time_end 
+0

您的查询可以正常工作,但它只是返回所有行,并将其中的一些行增加了一倍...... – dissidianUltima

+0

根据您上面提供的数据,我试着在我的结尾处给出与您所提供的完全相同的输出,而没有任何重复记录。 –

+0

数据是那些与prof_schedule相匹配的数据的三倍 – dissidianUltima

相关问题