Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Thuật toán tạo lịch trình hiệu quả trong SQL

Câu trả lời này chỉ có nghĩa là một hướng giải pháp cho phần lịch trình, không phải là một giải pháp tốt đẹp 100%:

Những gì bạn đã tạo, yêu cầu các vòng lặp để có thể thỏa mãn tất cả các điều kiện.

Để giải quyết một trường hợp như vậy nhanh hơn, có thể thực tế là làm việc trong các vectơ, thay vào đó, trong vectơ, tất cả các vị trí được biểu thị bằng 0 (có sẵn) và 1 (lấy).

Vì vậy, vấn đề sinh viên / toán-1:

Giả sử có 2 phòng và 3 giờ:Vectơ toán học-1 trên mỗi phòng khi đó là:

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

Về cơ bản (tôi ít nhất) không quan tâm đến việc một phòng nhất định còn trống miễn là 1 phòng còn trống:Vì vậy, AND cho mỗi chỉ mục có thể là câu trả lời trong trường hợp này cho tình trạng phòng trống (hãy nhớ:0 có sẵn):

Phòng 1:[1 0 0] Phòng 2:[0 0 0] Kết quả phòng:[1 0 0] VÀ [0 0 0] =[0 0 0]

Vì vậy, một AND có thể cho biết liệu giờ đầu tiên có còn không.

Nếu bây giờ bạn kết hợp điều này với một sinh viên với số giờ có sẵn (cũng chỉ là 3 cho ví dụ này):

Sinh viên A:[0 0 1] Kết quả phòng:[0 0 0] Sinh viên đối sánh với phòng bằng OR cho thao tác này:[0 0 1] OR [0 0 0] =[0 0 1]

Vì vậy, sinh viên A sẽ khớp với kết quả phòng.

Trong SQL:Mô hình dữ liệu (phần:Thiếu là khớp khóa học):Phòng bàn:

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
)

Tất cả dữ liệu đã được chèn đầy đủ vào các bảng:Trong trường hợp này là 1 phòng, 3 giờ, 3 chỗ.

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

Sinh viên có:

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

Vì vậy, sinh viên chỉ có thể có mặt trong hai giờ đầu tiên.

Để nhận kết quả từ một truy vấn:

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

Kết quả này chỉ phải được chia thành các nhóm tối đa là 8, trong đó nó là phần cuối của phần SQL và thời gian cho một ngôn ngữ lập trình khác.

Mô hình này có thể được mở rộng với ngày tháng, tuy nhiên, mô hình này hoạt động tốt nhất khi chỉ sử dụng giờ và các ngày trong tuần (tính khả dụng của các ngày trong tuần lại là 0 hoặc 1).

Như tôi đã nói:đây là một khái niệm / ý tưởng, không phải là một giải pháp 100%, vì vậy nó cần phải làm việc trước khi bạn có thể sử dụng nó .....



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Truy vấn Laravel để nhận kết quả có ít nhất một phần tử của mảng?

  2. Symfony2 tạo và duy trì các mối quan hệ thực thể

  3. Tự động truy cập DB5 vào MySQL

  4. Cách tính số người dùng hoạt động hàng tuần (WAU) trong MySQL

  5. NHÓM MySQL THEO NULL và EMPTY