sql >> Databáze >  >> RDS >> Mysql

SQL efektivní algoritmus generování rozvrhu

Tato odpověď je myšlena pouze jako směr řešení pro část plánu, nikoli jako 100% pěkné řešení:

To, co jste vytvořili, vyžaduje smyčky, aby bylo možné splnit všechny podmínky.

Aby byl takový případ vyřešen rychleji, může být praktické pracovat s vektory, ve kterých jsou všechny pozice ve vektoru reprezentovány 0 (dostupné) a 1 (obsazeno).

Takže problém student/matematika-1:

Řekněme, že existují 2 místnosti a 3 hodiny:Matematický vektor 1 na místnost je pak:

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

V podstatě (alespoň mě) je jedno, zda je určitý pokoj k dispozici, pokud je k dispozici 1:V tomto případě by tedy odpovědí na dostupnost mohl být AND za index (nezapomeňte:0 je k dispozici):

Místnost 1:[1 0 0] Místnost 2:[0 0 0] Výsledek místnosti:[1 0 0] A [0 0 0]=[0 0 0]

Takže AND může zjistit, zda je první hodina stále k dispozici.

Pokud to nyní zkombinujete se studentem s dostupnými hodinami (také pouze 3 pro tento příklad):

Student A:[0 0 1]Výsledek místnosti:[0 0 0]Student odpovídá místnosti pomocí OR pro tuto operaci:[0 0 1] NEBO [0 0 0]=[0 0 1]

Takže student A by odpovídal výsledku místnosti.

V SQL:Datový model (část:Chybí shoda kurzu):Tabulka:

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
)

Všechna data byla vložena do tabulek v plném rozsahu:V tomto případě 1 pokoj, 3 hodiny, 3 místa k dispozici.

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 má:

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

Student je tedy k dispozici pouze v prvních dvou hodinách.

Chcete-li nyní získat výsledek z dotazu:

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

Tento výsledek stačí rozdělit do skupin maximálně 8, ve kterých je konec části SQL a čas pro další programovací jazyk.

Tento model lze rozšířit o datum, ale nejlépe funguje při použití pouze hodin a pracovních dnů (dostupnost ve všední dny je opět 0 nebo 1).

Jak jsem uvedl:toto je koncept/nápad, nikoli 100% řešení, takže je třeba zapracovat, než jej budete moci použít.....



  1. Zkontrolujte, zda databáze v PostgreSQL existuje pomocí shellu

  2. Jak získat jméno a jméno manažera

  3. Jak v SQL aktualizujete každý řádek tabulky nalezením všech řádků, které jsou pro sloupec stejné, a poté nastavte další sloupec na stejný

  4. XCode, Authentication a NSUserDefaults