私の2番目の解決策は、(最初のコメントへのコメントで述べたように)かなり複雑ですが、私はそれもかなり効率的だと思います。
私はコードを投稿するのではなく、全体のコンセプトを投稿します。具体的な詳細に興味がある場合は、私ができることを見ていきます。
問題:毎日の各部屋が利用可能であるかブロックされている抽象を作成します。ゲストが訪れたい時間に利用可能な部屋に興味があります。 ゲストの移転を最小限に抑える必要のある部屋の組み合わせを選択したいと考えています。
要約:毎日が2の累乗で表される部屋/日の組み合わせの2次元マトリックスを作成します(DAYVALUE)。利用可能な部屋には対応するDAYVALUEがあります。 SEROの値としてブロックされている部屋。ですから、ROOMのすべての日を合計してROOMの組み合わせがフルタイムを達成するかどうかを判断できます。
詳細:ROOMのすべてのVALUESのSUMを取得した後、バイナリOR関数を使用して、OR演算の結果を値のSUMと比較して、指定された部屋の組み合わせが完全な滞在を満たしているかどうかを判断できますすべての日。
DAYVALUEはdayTableに格納されないことに注意してください。あなたはすべての日含むテーブルを作成する必要が
1):これは、すべての要求(2 ^(STARTDAY-DAY))
コンクリートのために計算されます。それは、日付を含む正確に1つの列を持っています(時間はなく、時間帯は1日しかありません)。私は今から百年後までのすべての日を含めることをお勧めします。 (したがって、あなたは一度だけそれを設定しなければならないでしょう)。 (注:これは、SQLクエリに一度、毎日選択することはできません問題を解決)
2)あなたは、このような出力生成VIEW作成:
DAY ; DAYVALUE ; ROOM1 ; ROOM2; ROOM3 ; ROOM4 ; ... ; ROOMn
20120313 ; 1 ; 0 ; 0; 1 ; 1 ; ... ;
20120314 ; 2 ; 2 ; 0; 2 ; 2 ; ... ;
20120315 ; 4 ; 4 ; 0; 0 ; 4 ; ... ;
20120316 ; 8 ; 8 ; 0; 0 ; 0 ; ... ;
20120317 ; 16 ; 16 ; 16; 16 ; 0 ; ... ;
3)本のSUMをプロデュース。部屋値のいずれかの単一のすべての時間をDAYVALUEの合計と一致した(したがって、利用可能な場合4が2つずつのOR値を作成して成功しなかった場合
DAYVALUE ; ROOM1 ; ROOM2; ROOM3 ; ROOM4 ; ... ; ROOMn
31 ; 30 ; 16; 19 ; 7 ; ... ;
4)))
5を参照してください結果のとどれもあなたが3 ROOMSなどのためにこれを続行する必要が二つの部屋のために一致しない場合DAYVALUE
ROOM1 OR ROOM2 = 30 <> 31
ROOM1 OR ROOM3 = 31 == 31. This is a valid match of rooms.
6)のSUMと比較します。
この手順を使用すると、訪問時に利用可能な正しい部屋のセットが常に生成されます。正しい方法でデータベースを構築する(または部屋が十分に少ない)場合、クエリは許容時間内に完了する必要があります。
楽しんでください(私が持っていました)
私はこれをSQLでコーディングすることはできますが、SQLでコード化することができます。それが助けになるだろうか? –
Angelo、 私は間違いなくいくつかのSQLを見て興味があると思います! – Tom
あなたの問題を解決できますか?はいの場合はどうですか?そして、ここの答えのどれがあなたを助けましたか? –