Esta respuesta solo pretende ser una dirección de solución para la parte del cronograma, no una solución 100% agradable:
Lo que creó requiere bucles para poder satisfacer todas las condiciones.
Para resolver este caso más rápido, puede ser práctico trabajar en vectores en los que en el vector todas las posiciones están representadas por 0 (disponible) y 1 (tomada).
Así que el problema estudiante/matemáticas-1:
Digamos que hay 2 habitaciones y 3 horas:el vector matemático-1 por habitación es entonces:
Room 1: [0 0 0]
Room 2: [0 0 0]
Esencialmente (al menos a mí) no me importa si una determinada habitación está disponible siempre que 1 esté disponible:por lo tanto, un AND por índice podría ser la respuesta en este caso para la disponibilidad (recuerde:0 está disponible):
Habitación 1:[1 0 0]Habitación 2:[0 0 0]Resultado de la habitación:[1 0 0] Y [0 0 0]=[0 0 0]
Entonces, un AND puede decir si la primera hora aún está disponible.
Si ahora combina esto con un estudiante con las horas disponibles (también solo 3 para este ejemplo):
Estudiante A:[0 0 1] Resultado de la habitación:[0 0 0] El estudiante coincide con la habitación usando un OR para esta operación:[0 0 1] OR [0 0 0]=[0 0 1]
Entonces, el estudiante A coincidiría con el resultado de la habitación.
En SQL:El modelo de datos (parte:Falta la coincidencia del curso):Sala de mesa:
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
)
Todos los datos se han insertado en tablas en su totalidad:En este caso 1 habitación, 3 horas, 3 plazas 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);
El estudiante tiene:
INSERT INTO student VALUES(1,0,1);
INSERT INTO student VALUES(1,0,2);
INSERT INTO student VALUES(1,1,3);
Entonces, el estudiante está disponible solo en las primeras dos horas.
Para obtener ahora un resultado de una consulta:
SELECT room_id
FROM room a
INNER JOIN student b ON a.space=b.space AND a.hour=b.hour;
Este resultado solo hay que dividirlo en los grupos de máximo 8, en los que es el final de la parte SQL y el tiempo para otro lenguaje de programación.
Este modelo se puede expandir con una fecha; sin embargo, funciona mejor cuando se usan solo horas y días de la semana (la disponibilidad de los días de la semana vuelve a ser 0 o 1).
Como dije:este es un concepto/idea, no una solución al 100%, por lo que necesita trabajo antes de que pueda usarlo...