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

考えられるすべての組み合わせは、n 方向の外積 (結合) です。

SQL は、個別のタイム スロットの数を把握できず、その数の結合を使用して選択ステートメントを構築できません。したがって、パントして自分で行う必要があります。

したがって、一意の時間枠ごとに、コースが重複しないすべてのコースに参加してください。

結果として得られる行のセットは、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 に答える
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 に開始するレッスンがある場合、1 時間ではなく 30 分のタイムスロットが必要になります。学校や大学を見ると、おそらくこれでいいと思います。

于 2010-12-07T14:53:40.723 に答える
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 に答える