Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Algoritma pembuatan jadwal efisien SQL

Jawaban ini hanya dimaksudkan sebagai arah solusi untuk bagian jadwal, bukan solusi 100% bagus:

Apa yang Anda buat, membutuhkan loop untuk dapat memenuhi semua kondisi.

Untuk menyelesaikan kasus seperti itu lebih cepat, praktis untuk bekerja dalam vektor, bukan di mana dalam vektor semua posisi diwakili oleh 0 (tersedia) dan 1 (diambil).

Jadi soal siswa/matematika-1:

Katakanlah ada 2 kamar dan 3 jam:Maka vektor matematika-1 per kamar adalah:

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

Pada dasarnya (setidaknya saya) tidak peduli jika kamar tertentu tersedia selama 1 tersedia:Jadi AND per indeks bisa menjadi jawaban dalam hal ini untuk ketersediaan (ingat:0 tersedia):

Kamar 1:[1 0 0]Ruangan 2:[0 0 0]Hasil kamar:[1 0 0] AND [0 0 0]=[0 0 0]

Jadi AND dapat mengetahui apakah jam pertama masih tersedia.

Jika sekarang Anda menggabungkan ini dengan siswa dengan jam yang tersedia (juga hanya 3 untuk contoh ini):

Siswa A:[0 0 1]Hasil ruangan:[0 0 0]Siswa mencocokkan dengan ruangan menggunakan OR untuk operasi ini:[0 0 1] OR [0 0 0]=[0 0 1]

Jadi siswa A akan mencocokkan dengan hasil ruangan.

Dalam SQL:Model data (bagian:Yang hilang adalah kecocokan kursus):Ruang meja:

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
)

Semua data telah dimasukkan ke dalam tabel secara lengkap:Dalam hal ini 1 kamar, 3 jam, 3 tempat tersedia.

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

Siswa memiliki:

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

Jadi siswa hanya tersedia dalam dua jam pertama.

Untuk sekarang mendapatkan hasil dari kueri:

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

Hasil ini hanya perlu dipecah menjadi kelompok-kelompok maksimal 8, di mana itu adalah akhir dari bagian SQL dan waktu untuk bahasa pemrograman lain.

Model ini dapat diperluas dengan tanggal, namun ini berfungsi paling baik jika hanya menggunakan jam dan hari kerja (ketersediaan hari kerja kembali 0 atau 1).

Seperti yang saya nyatakan:ini adalah konsep/ide, bukan solusi 100%, jadi perlu kerja sebelum Anda dapat menggunakannya.....



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP PDO multiple select query secara konsisten menjatuhkan rowset terakhir

  2. mysql - cari stempel waktu berdasarkan jam

  3. CakePHP 1.3 - Kolom tidak diketahui di mana klausa

  4. MySql :Pesan oleh dan Grup Dengan menggabungkan tidak memberikan catatan terbaru

  5. Pilih duplikat dari satu baris?