この回答は、100%優れた解決策ではなく、スケジュール部分の解決策の方向性として意図されています。
作成したものは、すべての条件を満たすことができるようにループが必要です。
このようなケースをより迅速に解決するには、代わりにベクトルで作業するのが実用的です。ベクトルでは、すべての位置が0(使用可能)と1(取得済み)で表されます。
したがって、学生/数学-1の問題:
2つの部屋と3時間あるとしましょう:数学-1部屋あたりのベクトルは次のようになります:
Room 1: [0 0 0]
Room 2: [0 0 0]
基本的に(少なくとも私は)1が利用可能である限り、特定の部屋が利用可能かどうかは気にしません。したがって、この場合、可用性についてはインデックスごとのANDが答えになる可能性があります(覚えておいてください:0が利用可能です):
部屋1:[1 0 0]部屋2:[0 0 0]部屋の結果:[1 0 0] AND [0 0 0] =[0 0 0]
したがって、ANDは、最初の1時間がまだ利用可能かどうかを判断できます。
これを利用可能な時間のある学生と組み合わせる場合(この例では3時間のみ):
学生A:[0 0 1]部屋の結果:[0 0 0]学生はこの操作のORを使用して部屋と一致します:[0 0 1] OR [0 0 0] =[0 0 1]
したがって、学生Aは部屋の結果に一致します。
SQLの場合:データモデル(一部:欠落しているのはコースの一致です):テーブルルーム:
CREATE TABLE room(
room_id INT,
space TINYINT DEFAULT 0,
hour INT DEFAULT 1
);
CREATE TABLE student(
student_id INT,
space TINYINT DEFAULT 0,
hour INT DEFAULT 1
)
すべてのデータが完全にテーブルに挿入されています。この場合、1部屋、3時間、3か所が利用可能です。
INSERT INTO room VALUES (1,0,1);
INSERT INTO room VALUES (1,0,1);
INSERT INTO room VALUES (1,0,1);
INSERT INTO room VALUES (1,0,2);
INSERT INTO room VALUES (1,0,2);
INSERT INTO room VALUES (1,0,2);
INSERT INTO room VALUES (1,0,3);
INSERT INTO room VALUES (1,0,3);
INSERT INTO room VALUES (1,0,3);
学生が持っている:
INSERT INTO student VALUES(1,0,1);
INSERT INTO student VALUES(1,0,2);
INSERT INTO student VALUES(1,1,3);
そのため、学生は最初の2時間のみ利用できます。
クエリから結果を取得するには:
SELECT room_id
FROM room a
INNER JOIN student b ON a.space=b.space AND a.hour=b.hour;
この結果は、最大8つのグループに分割するだけで済みます。このグループでは、SQL部分の終わりであり、別のプログラミング言語の時間です。
このモデルは日付で拡張できますが、時間と平日のみを使用する場合に最適に機能します(平日の可用性も0または1です)。
私が述べたように、これは概念/アイデアであり、100%のソリューションではないため、使用する前に作業が必要です.....