0

所以我有下表包含可供我参加的课程:

"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

4 回答 4

0

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

SELECT *
FROM `courses`
WHERE `day` LIKE 'M'
AND `timein` >= 9.0 AND `timein` < 10.3
AND `courseID` !=11
于 2010-12-07T14:06:40.013 回答
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 分钟的时间段而不是一个小时,但是如果你是看一所学校或大学,我认为这可能会很好。

于 2010-12-07T14:53:40.723 回答
0

所有可能的组合都是 n 路叉积(连接)。

SQL 无法计算出有多少不同的时隙,并构造一个带有那么多连接的 select 语句。因此,您将不得不自己下注并执行此操作。

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

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

于 2010-12-07T15:30:42.633 回答
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 |
+-----------+----------+----------+-----------+----------+----------+
于 2010-12-07T15:53:00.230 回答