sql >> Database teknologi >  >> RDS >> Mysql

SQL effektiv skemagenereringsalgoritme

Dette svar er kun ment som en løsningsvejledning for skemadelen, ikke en 100 % god løsning:

Det du har lavet, kræver loops for at kunne opfylde alle betingelser.

For at få en sådan sag løst hurtigere, kan det være praktisk at arbejde i vektorer i stedet, hvor alle positioner i vektoren er repræsenteret med 0 (tilgængelig) og 1 (optaget).

Så elev/matematik-1 problemstillingen:

Lad os sige, at der er 2 rum og 3 timer:Math-1 vektoren pr. værelse er så:

Room 1: [0 0 0]
Room 2: [0 0 0]

Grundlæggende (jeg er i hvert fald) ligeglad med, om et bestemt værelse er ledigt, så længe 1 er tilgængeligt:​​Så et OG pr. indeks kunne være svaret i dette tilfælde for tilgængelighed (husk:0 er tilgængelig):

Rum 1:[1 0 0]Rum 2:[0 0 0]Rumresultat:[1 0 0] OG [0 0 0]=[0 0 0]

Så en AND kan fortælle om den første time stadig er ledig.

Hvis du nu kombinerer dette med en elev med de ledige timer (også kun 3 for dette eksempel):

Elev A:[0 0 1]Rumresultat:[0 0 0]Elev matcher med værelse ved hjælp af en OR til denne operation:[0 0 1] OR [0 0 0]=[0 0 1]

Så elev A ville matche rummets resultat.

I SQL:Datamodellen (del:Mangler er kursusmatchet):Tabelrum:

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
)

Alle data er blevet indsat i tabeller fuldt ud:I dette tilfælde 1 rum, 3 timer, 3 ledige pladser.

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);   

Så eleven er kun tilgængelig i de første to timer.

For nu at få et resultat fra en forespørgsel:

SELECT room_id
FROM room a
INNER JOIN student b ON a.space=b.space AND a.hour=b.hour;

Dette resultat skal kun opdeles i grupperne på maksimalt 8, hvor det er slutningen af ​​SQL-delen og tiden for et andet programmeringssprog.

Denne model kan udvides med en dato, men den fungerer bedst, når der kun bruges timer og hverdage (tilgængelighed på ugedage er igen 0 eller 1).

Som jeg sagde:dette er et koncept/idé, ikke en 100% løsning, så det kræver arbejde, før du kan bruge det.....



  1. MySql:Find rækkenummer for specifik post

  2. Sådan rettes:"SQLServerAgent kører ikke i øjeblikket ..."

  3. MySQL:FEJL 1227 (42000):Adgang nægtet - Kan ikke OPRET BRUGER

  4. Afspil Framework Image BLOB-fil til testobjekt Yaml