sql >> Databasteknik >  >> RDS >> Mysql

SQL effektiv schemagenereringsalgoritm

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.....



  1. Skapa en json-array med hjälp av concat med MySql

  2. Databas:Bästa sättet att fråga efter geografisk platsdata?

  3. Hur man kompenserar en HTML-tabell med PHP för att subtrahera cellvärdet på 1:a raden från 2:a radens cellvärde i olika kolumner

  4. Hur man installerar MySQL på Debian 7