Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Wydajny algorytm generowania harmonogramu SQL

Ta odpowiedź ma na celu jedynie ukierunkowanie rozwiązania dla części harmonogramu, a nie 100% fajne rozwiązanie:

To, co stworzyłeś, wymaga pętli, aby były w stanie spełnić wszystkie warunki.

Aby szybciej rozwiązać taki przypadek, praktyczna może być praca na wektorach, w których wszystkie pozycje są reprezentowane przez 0 (dostępne) i 1 (zajęte).

Więc problem studenta/matematyki-1:

Załóżmy, że są 2 pokoje i 3 godziny:wektor matematyczny 1 na pomieszczenie to:

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

Zasadniczo (przynajmniej ja) nie dbam o to, czy określony pokój jest dostępny, o ile jest dostępny 1:Więc AND na indeks może być w tym przypadku odpowiedzią na dostępność (pamiętaj:0 jest dostępne):

Pokój 1:[1 0 0]Pokój 2:[0 0 0]Wynik dotyczący pokoju:[1 0 0] AND [0 0 0]=[0 0 0]

Więc AND może powiedzieć, czy pierwsza godzina jest nadal dostępna.

Jeśli teraz połączysz to z uczniem z dostępnymi godzinami (również tylko 3 w tym przykładzie):

Uczeń A:[0 0 1]Wynik sali:[0 0 0]Uczeń pasuje do sali za pomocą OR dla tej operacji:[0 0 1] OR [0 0 0]=[0 0 1]

Więc uczeń A pasuje do wyniku pokoju.

W języku SQL:Model danych (część:Brak jest dopasowania kursu):Sala stołowa:

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
)

Wszystkie dane zostały wstawione do tabel w całości:w tym przypadku 1 pokój, 3 godziny, 3 wolne miejsca.

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

Student ma:

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

Więc uczeń jest dostępny tylko przez pierwsze dwie godziny.

Aby teraz uzyskać wynik zapytania:

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

Ten wynik musi być tylko podzielony na grupy po maksymalnie 8, w których jest to koniec części SQL i czas dla innego języka programowania.

Ten model można rozszerzyć o datę, jednak działa najlepiej, gdy używa się tylko godzin i dni tygodnia (dostępność w dni powszednie ponownie wynosi 0 lub 1).

Jak powiedziałem:jest to koncepcja/pomysł, a nie 100% rozwiązanie, więc wymaga pracy, zanim będzie można go użyć.....



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak wygenerować unikalny, losowy ciąg dla jednej z moich kolumn tabeli MySql?

  2. Wybór wiersza z max w kolumnie - MySQL

  3. Jak opuścić dołączenie 2 tabel w 2 różnych bazach danych?

  4. Wybierz część z pola MySQL Blob.

  5. Jak obliczyć współczynnik za pomocą zapytania sql?