Mysql
 sql >> база данни >  >> RDS >> Mysql

SQL ефективен алгоритъм за генериране на график

Този отговор е предназначен само като посока на решение за частта от графика, а не като 100% хубаво решение:

Това, което сте създали, изисква цикли, за да може да удовлетвори всички условия.

За да се реши такъв случай по-бързо, може да бъде практично да се работи във вектори, в които във вектора всички позиции са представени с 0 (налични) и 1 (заети).

И така, проблемът за студент/математика-1:

Да кажем, че има 2 стаи и 3 часа:Векторът по математика-1 на стая е след това:

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

По същество (поне мен) не ме интересува дали дадена стая е налична, стига 1 да е налично:Така че И за индекс може да бъде отговорът в този случай за наличност (не забравяйте:0 е налично):

Стая 1:[1 0 0] Стая 2:[0 0 0] Резултат от стая:[1 0 0] И [0 0 0]=[0 0 0]

Така че И може да каже дали първият час все още е наличен.

Ако сега комбинирате това с ученик с наличните часове (също само 3 за този пример):

Ученик A:[0 0 1] Резултат от стаята:[0 0 0] Студент съвпада със стая, използвайки ИЛИ за тази операция:[0 0 1] ИЛИ [0 0 0]=[0 0 1]

Така ученикът А ще съвпадне с резултата от стаята.

В SQL:Моделът на данните (част:Липсва е съвпадението на курса):Стая за маса:

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
)

Всички данни са вмъкнати в таблици изцяло:В този случай 1 стая, 3 часа, 3 свободни места.

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

Студентът има:

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

Така че ученикът е на разположение само през първите два часа.

За да получите резултат от заявка:

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

Този резултат трябва само да бъде разделен на групи от максимум 8, в които това е краят на SQL частта и времето за друг език за програмиране.

Този модел може да бъде разширен с дата, но работи най-добре, когато се използват само часове и делнични дни (наличността от делнични дни отново е 0 или 1).

Както казах:това е концепция/идея, а не 100% решение, така че се нуждае от работа, преди да можете да го използвате.....



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да подредите резултатите от заявката за Infinite Scroll?

  2. Задайте стойността на mySQL MAX на java променлива

  3. Вътрешно съединение между три таблици в mysql

  4. Изберете от mysql, поставен в променлива VB.NET

  5. Забележка:Недефинирана променлива:db при използване на PDO