Mysql
 sql >> Base de données >  >> RDS >> Mysql

Algorithme de génération de planification efficace SQL

Cette réponse est simplement conçue comme une direction de solution pour la partie calendrier, pas une solution 100 % agréable :

Ce que vous avez créé nécessite des boucles pour pouvoir satisfaire toutes les conditions.

Pour résoudre un tel cas plus rapidement, il peut être pratique de travailler dans des vecteurs à la place dans lesquels dans le vecteur toutes les positions sont représentées par 0 (disponible) et 1 (prise).

Donc le problème étudiant/maths-1 :

Disons qu'il y a 2 pièces et 3 heures :Le vecteur math-1 par pièce est alors :

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

Essentiellement (du moins moi) je ne me soucie pas de savoir si une certaine chambre est disponible tant que 1 est disponible :Donc, un ET par index pourrait être la réponse dans ce cas pour la disponibilité (rappelez-vous :0 est disponible) :

Salle 1 :[1 0 0]Salle 2 :[0 0 0]Résultat de la salle :[1 0 0] ET [0 0 0]=[0 0 0]

Ainsi, un ET peut dire si la première heure est toujours disponible.

Si vous combinez maintenant cela avec un étudiant avec les heures disponibles (également seulement 3 pour cet exemple) :

Étudiant A : [0 0 1]Résultat de la salle :[0 0 0]L'étudiant correspond à la salle en utilisant un OU pour cette opération :[0 0 1] OU [0 0 0]=[0 0 1]

Ainsi, l'élève A correspondrait au résultat de la salle.

En SQL :Le modèle de données (partie :Il manque la correspondance du cours) :Salle de table :

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
)

Toutes les données ont été insérées dans des tableaux dans leur intégralité :dans ce cas, 1 salle, 3 heures, 3 places disponibles.

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

L'élève a :

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

L'élève est donc disponible uniquement les deux premières heures.

Pour maintenant obtenir un résultat d'une requête :

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

Ce résultat n'a qu'à être divisé en groupes de maximum 8, dans lesquels il s'agit de la fin de la partie SQL et du temps pour un autre langage de programmation.

Ce modèle peut être étendu avec une date, mais il fonctionne mieux en utilisant uniquement les heures et les jours de la semaine (la disponibilité en semaine est à nouveau 0 ou 1).

Comme je l'ai dit :il s'agit d'un concept/d'une idée, pas d'une solution à 100 %, il faut donc travailler avant de pouvoir l'utiliser...