2010-12-07 37 views
0

所以我有一个包含现有的课程,我参加下表:MySQL的课程调度

"CREATE TABLE courses 
(
subject varchar(15), 
course int, 
day varchar(15), 
timein double, 
timeout double, 
courseID int 
)"; 

例如:主题= ECON,当然= 101天= M,timein = 9.0,超时= 10.3 ,courseID = 11. 我需要找到一个MySQL脚本,它可以给我所有可能的课程组合,而不会产生时间冲突。 谢谢

+0

当您说“超时= 10.3”时,您是否认为这将是10:30?难道它不会 - 假设每个人都有相同的时间表或多或少 - 在一个单独的表中有一组标准时隙比较明智,因此时隙1是9-10,时隙2是10-11等等?这会大大简化您的搜索。 – glenatron 2010-12-07 14:04:43

回答

0

此查询搜索所有在给定课程中开始的课程,期望课程本身。

SELECT * 
FROM `courses` 
WHERE `day` LIKE 'M' 
AND `timein` >= 9.0 AND `timein` < 10.3 
AND `courseID` !=11 
0

因此,为了延长我的建议的意见,我想也许这样规范化表:

CREATE TABLE course 
{ 
    ID int 
    subject varchar(100) 
} 

CREATE TABLE lesson 
( 
    timeslotID int 
    courseID int 
); 

CREATE TABLE timeslots 
(
    ID int, 
    day varchar(10), 
    timein double, 
    timeout double 
) 

你也可以离开一天的课表,并有较少的时隙,这使得大多数的区别到你如何查询数据。无论哪种方式,您的碰撞查询将是寻找所有匹配时隙的简单问题。这很可能会导致查询中出现更多JOIN,但数据重复性要少得多。

显然这里的限制是你的时隙必须是离散的,所以如果你有一些课程在10:00开始,有些在10:30开始你需要有30分钟的时隙而不是一个小时,但是如果你正在看一所学校或大学,我认为这可能会很好。

0

所有可能的组合是一个n路交叉产品(连接)。

SQL无法弄清楚有多少个不同的时隙存在AND构造一个包含多个联接的select语句。所以你将不得不踢,并自己做。

因此,对于每个独特的时间段,加入课程不重叠的所有课程。

得到的一组行将N×M,其中N是唯一时隙的数量,M是可能组合的数量。

0

这可能是你的都是经过简化版本 - 它不包括天,但应该是相当简单的加:

一个例子表的一些数据:

CREATE TABLE `courses` (
    `course_id` int(11) NOT NULL AUTO_INCREMENT, 
    `time_in` time DEFAULT NULL, 
    `time_out` time DEFAULT NULL, 
    PRIMARY KEY (`course_id`) 
) ENGINE=InnoDB; 

INSERT INTO courses VALUES 
(1, '09:00', '10:00'), 
(2, '09:30', '10:30'), 
(3, '10:00', '11:00'), 
(4, '10:30', '11:30'), 
(5, '12:00', '13:00'); 

对于每一行(每个时隙),确定是否有其他行不重叠。请注意,这允许相同的结束和开始时间:

SELECT 
    c1.course_id, 
    c1.time_in, 
    c1.time_out, 
    c2.course_id, 
    c2.time_in, 
    c2.time_out 
FROM courses AS c1 
JOIN (
    SELECT course_id, time_in, time_out FROM courses 
) AS c2 
ON (c1.time_out > c2.time_in) XOR (c1.time_in < c2.time_out) 
ORDER BY c1.course_id, c1.time_in; 

+-----------+----------+----------+-----------+----------+----------+ 
| course_id | time_in | time_out | course_id | time_in | time_out | 
+-----------+----------+----------+-----------+----------+----------+ 
|   1 | 09:00:00 | 10:00:00 |   3 | 10:00:00 | 11:00:00 | 
|   1 | 09:00:00 | 10:00:00 |   4 | 10:30:00 | 11:30:00 | 
|   1 | 09:00:00 | 10:00:00 |   5 | 12:00:00 | 13:00:00 | 
|   2 | 09:30:00 | 10:30:00 |   4 | 10:30:00 | 11:30:00 | 
|   2 | 09:30:00 | 10:30:00 |   5 | 12:00:00 | 13:00:00 | 
|   3 | 10:00:00 | 11:00:00 |   1 | 09:00:00 | 10:00:00 | 
|   3 | 10:00:00 | 11:00:00 |   5 | 12:00:00 | 13:00:00 | 
|   4 | 10:30:00 | 11:30:00 |   5 | 12:00:00 | 13:00:00 | 
|   4 | 10:30:00 | 11:30:00 |   2 | 09:30:00 | 10:30:00 | 
|   4 | 10:30:00 | 11:30:00 |   1 | 09:00:00 | 10:00:00 | 
|   5 | 12:00:00 | 13:00:00 |   1 | 09:00:00 | 10:00:00 | 
|   5 | 12:00:00 | 13:00:00 |   2 | 09:30:00 | 10:30:00 | 
|   5 | 12:00:00 | 13:00:00 |   3 | 10:00:00 | 11:00:00 | 
|   5 | 12:00:00 | 13:00:00 |   4 | 10:30:00 | 11:30:00 | 
+-----------+----------+----------+-----------+----------+----------+