Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Algoritmo de geração de agendamento eficiente SQL


Esta resposta é apenas uma direção de solução para a parte do cronograma, não uma solução 100% boa:

O que você criou requer loops para poder satisfazer todas as condições.

Para resolver esse caso mais rapidamente, pode ser prático trabalhar em vetores, em que no vetor todas as posições são representadas por 0 (disponível) e 1 (obtido).

Então, a questão do aluno/matemática-1:

Digamos que haja 2 salas e 3 horas:O vetor math-1 por sala é então:
Room 1: [0 0 0]
Room 2: [0 0 0]

Essencialmente (pelo menos eu) não me importo se um determinado quarto estiver disponível enquanto 1 estiver disponível:Então, um AND por índice poderia ser a resposta neste caso para disponibilidade (lembre-se:0 está disponível):

Sala 1:[1 0 0]Sala 2:[0 0 0]Resultado da sala:[1 0 0] AND [0 0 0]=[0 0 0]

Assim, um AND pode dizer se a primeira hora ainda está disponível.

Se você agora combinar isso com um aluno com as horas disponíveis (também apenas 3 para este exemplo):

Aluno A:[0 0 1]Resultado da sala:[0 0 0]O aluno combina com a sala usando um OR para esta operação:[0 0 1] OR [0 0 0]=[0 0 1]

Assim, o aluno A corresponderia ao resultado da sala.

Em SQL:O modelo de dados (parte:Falta a correspondência do 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 os dados foram inseridos nas tabelas na íntegra:Neste caso 1 sala, 3 horas, 3 vagas disponíveis.
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);

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

Assim, o aluno está disponível apenas nas duas primeiras horas.

Para agora obter um resultado de uma consulta:
SELECT room_id
FROM room a
INNER JOIN student b ON a.space=b.space AND a.hour=b.hour;

Este resultado só tem que ser dividido nos grupos de no máximo 8, em que é o fim da parte SQL e tempo para outra linguagem de programação.

Este modelo pode ser expandido com uma data, mas funciona melhor quando se utiliza apenas horas e dias da semana (a disponibilidade dos dias da semana é novamente 0 ou 1).

Como afirmei:este é um conceito/ideia, não uma solução 100%, então precisa ser trabalhado antes que você possa usá-lo .....