2010-12-07 51 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 | 
+-----------+----------+----------+-----------+----------+----------+