Det här svaret är bara menat som en lösningsriktning för schemadelen, inte en 100 % trevlig lösning:
Det du skapat, kräver loopar för att kunna uppfylla alla förutsättningar.
För att få ett sådant fall löst snabbare kan det vara praktiskt att istället arbeta i vektorer där alla positioner i vektorn representeras av 0 (tillgänglig) och 1 (tagen).
Så elev/matte-1-frågan:
Säg att det finns 2 rum och 3 timmar:Math-1 vektorn per rum är då:
Room 1: [0 0 0]
Room 2: [0 0 0]
I huvudsak (åtminstone jag) bryr mig inte om om ett visst rum är tillgängligt så länge 1 är tillgängligt:Så ett OCH per index kan vara svaret i det här fallet för tillgänglighet (kom ihåg:0 är tillgängligt):
Rum 1:[1 0 0]Rum 2:[0 0 0]Rumsresultat:[1 0 0] OCH [0 0 0]=[0 0 0]
Så en AND kan säga om den första timmen fortfarande är ledig.
Om du nu kombinerar detta med en elev med tillgängliga timmar (även bara 3 för detta exempel):
Elev A:[0 0 1]Rumsresultat:[0 0 0]Eleven matchar rummet med hjälp av ett OR för denna operation:[0 0 1] ELLER [0 0 0]=[0 0 1]
Så elev A skulle matcha resultatet i rummet.
I SQL:Datamodellen (del:Saknas är kursmatchningen):Tabellrum:
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
)
All data har infogats i tabeller i sin helhet:I det här fallet 1 rum, 3 timmar, 3 platser tillgängliga.
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);
Eleven har:
INSERT INTO student VALUES(1,0,1);
INSERT INTO student VALUES(1,0,2);
INSERT INTO student VALUES(1,1,3);
Eleven är alltså endast tillgänglig under de första två timmarna.
För att nu få ett resultat från en fråga:
SELECT room_id
FROM room a
INNER JOIN student b ON a.space=b.space AND a.hour=b.hour;
Detta resultat behöver bara delas upp i grupper om maximalt 8, där det är slutet på SQL-delen och tiden för ett annat programmeringsspråk.
Denna modell kan utökas med ett datum, men det fungerar bäst när man använder bara timmar och vardagar (vardagstillgängligheten är återigen 0 eller 1).
Som jag sa:det här är ett koncept/idé, inte en 100% lösning, så det behöver arbete innan du kan använda det.....