Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Effizienter SQL-Algorithmus zur Zeitplanerstellung

Diese Antwort ist nur als Lösungsvorschlag für den Zeitplanteil gedacht, nicht als 100% nette Lösung:

Was Sie erstellt haben, erfordert Schleifen, um alle Bedingungen erfüllen zu können.

Um einen solchen Fall schneller zu lösen, kann es sinnvoll sein, stattdessen in Vektoren zu arbeiten, in denen im Vektor alle Positionen durch 0 (verfügbar) und 1 (belegt) repräsentiert werden.

Also das student/math-1-Problem:

Angenommen, es gibt 2 Räume und 3 Stunden:Der math-1-Vektor pro Raum ist dann:

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

Im Grunde (zumindest mir) ist es egal, ob ein bestimmtes Zimmer verfügbar ist, solange 1 verfügbar ist:Also könnte in diesem Fall ein UND pro Index die Antwort für die Verfügbarkeit sein (denken Sie daran:0 ist verfügbar):

Raum 1:[1 0 0]Raum 2:[0 0 0]Raumergebnis:[1 0 0] UND [0 0 0]=[0 0 0]

So kann ein UND feststellen, ob die erste Stunde noch verfügbar ist.

Wenn Sie dies jetzt mit einem Studenten kombinieren, mit den verfügbaren Stunden (ebenfalls nur 3 für dieses Beispiel):

Schüler A:[0 0 1]Raumergebnis:[0 0 0]Student stimmt mit Raum überein, wobei ein ODER für diese Operation verwendet wird:[0 0 1] ODER [0 0 0]=[0 0 1]

Der Student A würde also mit dem Raumergebnis übereinstimmen.

In SQL:Das Datenmodell (Teil:Fehlt der Kursübereinstimmung):Tabellenraum:

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 Daten sind vollständig in Tabellen eingetragen:In diesem Fall 1 Raum, 3 Stunden, 3 freie Plätze.

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

Schüler hat:

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

Der Student ist also nur in den ersten zwei Stunden verfügbar.

So erhalten Sie jetzt ein Ergebnis einer Abfrage:

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

Dieses Ergebnis muss nur in die Gruppen von maximal 8 aufgeteilt werden, in denen es das Ende des SQL-Teils und Zeit für eine andere Programmiersprache ist.

Dieses Modell kann mit einem Datum erweitert werden, es funktioniert jedoch am besten, wenn nur Stunden und Wochentage verwendet werden (Wochentagsverfügbarkeit ist wieder 0 oder 1).

Wie ich bereits sagte:Dies ist ein Konzept/eine Idee, keine 100%ige Lösung, also muss daran gearbeitet werden, bevor Sie es verwenden können.....