sql >> データベース >  >> RDS >> Mysql

SQLの効率的なスケジュール生成アルゴリズム

    この回答は、100%優れた解決策ではなく、スケジュール部分の解決策の方向性として意図されています。

    作成したものは、すべての条件を満たすことができるようにループが必要です。

    このようなケースをより迅速に解決するには、代わりにベクトルで作業するのが実用的です。ベクトルでは、すべての位置が0(使用可能)と1(取得済み)で表されます。

    したがって、学生/数学-1の問題:

    2つの部屋と3時間あるとしましょう:数学-1部屋あたりのベクトルは次のようになります:

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

    基本的に(少なくとも私は)1が利用可能である限り、特定の部屋が利用可能かどうかは気にしません。したがって、この場合、可用性についてはインデックスごとのANDが答えになる可能性があります(覚えておいてください:0が利用可能です):

    部屋1:[1 0 0]部屋2:[0 0 0]部屋の結果:[1 0 0] AND [0 0 0] =[0 0 0]

    したがって、ANDは、最初の1時間がまだ利用可能かどうかを判断できます。

    これを利用可能な時間のある学生と組み合わせる場合(この例では3時間のみ):

    学生A:[0 0 1]部屋の結果:[0 0 0]学生はこの操作のORを使用して部屋と一致します:[0 0 1] OR [0 0 0] =[0 0 1]

    したがって、学生Aは部屋の結果に一致します。

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

    そのため、学生は最初の2時間のみ利用できます。

    クエリから結果を取得するには:

    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. WITH句を使用したクエリでPostgresにFROM句のエントリエラーがありません

    2. 整合性制約違反:1048列'user_id'をnullにすることはできませんロールの割り当て時にエラーが発生します(Laravel 5.3)

    3. MySQLで優先度を使用して複数の列を検索するにはどうすればよいですか?

    4. テキストファイルの構造(テーブル)