Планировщик курса MySQL - PullRequest
       12

Планировщик курса MySQL

0 голосов
/ 07 декабря 2010

Итак, у меня есть следующая таблица, содержащая доступные для меня курсы:

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

Например: субъект = ECON, курс = 101, день = М, время = 9,0, время ожидания = 10,3, идентификатор курса = 11. Мне нужно найти сценарий MySQL, который даст мне все возможные комбинации курсов без временного конфликта. Спасибо

Ответы [ 4 ]

0 голосов
/ 07 декабря 2010

Это может быть упрощенная версия того, что вы ищете - она ​​не включает дни, но это должно быть довольно просто добавить:

Пример таблицы с некоторыми данными:

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 |
+-----------+----------+----------+-----------+----------+----------+
0 голосов
/ 07 декабря 2010

Итак, чтобы расширить свое предложение в комментариях, я бы, возможно, нормализовал вашу таблицу следующим образом:

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 голосов
/ 07 декабря 2010

Все возможные комбинации являются n-сторонним перекрестным произведением (объединение).

SQL не может определить, сколько существует разных временных интервалов, и построить оператор выбора с таким количеством объединений. Таким образом, вам придется надевать и делать это самостоятельно.

Следовательно, для каждого уникального временного интервала присоединяйтесь ко всем курсам, где курс не перекрывается.

Результирующий набор строк будет иметь значение N x M, где N - количество уникальных временных интервалов, а M - количество возможных комбинаций.

0 голосов
/ 07 декабря 2010

Этот запрос ищет все курсы, которые начинаются на данных курсах, ожидают сами курсы.

SELECT *
FROM `courses`
WHERE `day` LIKE 'M'
AND `timein` >= 9.0 AND `timein` < 10.3
AND `courseID` !=11
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...