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

Algoritmo di generazione di pianificazione efficiente SQL

Questa risposta è solo intesa come una direzione per la soluzione per la parte di pianificazione, non una buona soluzione al 100%:

Ciò che hai creato, richiede loop per poter soddisfare tutte le condizioni.

Per risolvere più rapidamente un caso del genere, può essere pratico lavorare invece in vettori in cui nel vettore tutte le posizioni sono rappresentate da 0 (disponibile) e 1 (preso).

Quindi il problema studente/matematica-1:

Supponiamo che ci siano 2 stanze e 3 ore:il vettore di matematica-1 per stanza è quindi:

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

In sostanza (almeno a me) non mi interessa se una certa stanza è disponibile fintanto che 1 è disponibile:quindi un AND per indice potrebbe essere la risposta in questo caso per la disponibilità (ricorda:0 è disponibile):

Stanza 1:[1 0 0]Stanza 2:[0 0 0]Risultato stanza:[1 0 0] AND [0 0 0]=[0 0 0]

Quindi un AND può dire se la prima ora è ancora disponibile.

Se ora lo combini con uno studente con le ore disponibili (anche solo 3 per questo esempio):

Studente A:[0 0 1]Risultato stanza:[0 0 0]Lo studente abbina la stanza usando un OR per questa operazione:[0 0 1] OR [0 0 0]=[0 0 1]

Quindi lo studente A corrisponderebbe al risultato della stanza.

In SQL:il modello di dati (parte:manca la corrispondenza del corso):Tavolo:

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
)

Tutti i dati sono stati inseriti integralmente nelle tabelle:In questo caso 1 camera, 3 ore, 3 posti disponibili.

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

Lo studente ha:

INSERT INTO student VALUES(1,0,1);   
INSERT INTO student VALUES(1,0,2);   
INSERT INTO student VALUES(1,1,3);   

Quindi lo studente è disponibile solo nelle prime due ore.

Per ottenere ora un risultato da una query:

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

Questo risultato deve essere suddiviso solo in gruppi di massimo 8, in cui è la fine della parte SQL e il tempo per un altro linguaggio di programmazione.

Questo modello può essere ampliato con una data, tuttavia funziona meglio quando si utilizzano solo ore e giorni feriali (la disponibilità nei giorni feriali è di nuovo 0 o 1).

Come ho affermato:questo è un concetto/idea, non una soluzione al 100%, quindi ha bisogno di lavoro prima di poterlo utilizzare.....