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

MySQLは、日付が日付の間にない行を選択します

    @Guestsを配置することに関心があると仮定します @StartDateから @EndDate

    SELECT DISTINCT r.id, 
    FROM room r 
         LEFT JOIN roombooking_room rbr ON r.id = rbr.room_id
         LEFT JOIN roombooking ON rbr.roombooking_id = rb.id
    WHERE COALESCE(@StartDate NOT BETWEEN rb.startDate AND rb.endDate, TRUE)
          AND COALESCE(@EndDate NOT BETWEEN rb.startDate AND rb.endDate, TRUE)
          AND @Guests < r.maxGuests
    

    無料で、指定された期間に指定された数のゲストを収容できるすべての部屋のリストを提供する必要があります。

    注意事項
    このクエリはシングルルームでのみ機能します。複数の部屋を確認する場合は、部屋の組み合わせに同じ基準を適用する必要があります。このためには、再帰クエリまたはいくつかのヘルパーテーブルが必要になります。また、COALESCEはNULLを処理するためにあります。部屋がまったく予約されていない場合、比較する日付のレコードがないため、完全に無料で返されることはありません。部屋。 date1またはdate2のいずれかがnullの場合、date1とdate2の間の日付はNULLを返し、colesceはそれをtrueに変更します(または、完全に無料の部屋のUNIONを実行することもできます。これは、より高速な場合があります)。

    複数の部屋があると、物事は本当に面白くなります。そのシナリオはあなたの問題の大きな部分ですか?また、どのデータベースを使用していますか。つまり、再帰クエリにアクセスできますか?

    編集

    前に何度も述べたように、必要な数のゲストと部屋の間で最適なものを取得したい場合、解決策(最初に最大の空き部屋を調べる欲張りアルゴリズム)を探す方法は最適ではありません。

    したがって、foreachを

    に置き換えると
    $bestCapacity = 0;
    $bestSolution = array();
    
    for ($i = 1; $i <= pow(2,sizeof($result))-1; $i++) {
        $solutionIdx = $i;
        $solutionGuests = 0;
        $solution = array();
        $j = 0;
        while ($solutionIdx > 0) :
            if ($solutionIdx % 2 == 1) {
                $solution[] = $result[$j]['id'];
                $solutionGuests += $result[$j]['maxGuests'];
            }
            $solutionIdx = intval($solutionIdx/2);
            $j++;
        endwhile;       
        if (($solutionGuests <= $bestCapacity || $bestCapacity == 0) && $solutionGuests >= $noGuests) {
            $bestCapacity = $solutionGuests;
            $bestSolution = $solution;
        }
    }
    
    print_r($bestSolution);
    print_r($bestCapacity);
    

    すべての可能な組み合わせを通過します 無駄なスペースを最小限に抑えるソリューションを見つけてください。



    1. MariaDBで小文字を含む行を見つける4つの方法

    2. SQL Server Management Studio(SSMS)からDDLスクリプト(作成)を生成する方法-SQL Server/TSQLチュートリアルパート17

    3. Tableが最適化をサポートしておらず、代わりに再作成+分析を行うとはどういう意味ですか?

    4. 作成時のみのMySQLタイムスタンプ