MySQL课程安排程序

时间:2010-12-07 13:55:02

标签: php mysql schedule

所以我有下表,其中包含我可以选择的课程:

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

例如:subject = ECON,course = 101,day = M,timein = 9.0,timeout = 10.3,courseID = 11。 我需要找到一个MySQL脚本,它将为我提供所有可能的课程组合,而不会产生时间冲突。 感谢

4 个答案:

答案 0 :(得分:0)

此查询将搜索在给定课程中开始的所有课程,并期望自己开设课程。

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

答案 1 :(得分: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点开始上课,有些时间是10点30分,那么你需要有30分钟的时间而不是一小时,但是如果你在看一所学校或大学,我觉得这可能会没问题。

答案 2 :(得分:0)

所有可能的组合都是n路交叉产品(加入)。

SQL无法弄清楚有多少个不同的时隙,并构造一个包含许多连接的select语句。所以你必须自己努力并自己做。

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

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

答案 3 :(得分: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 |
+-----------+----------+----------+-----------+----------+----------+