@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);
すべての可能な組み合わせを通過します 無駄なスペースを最小限に抑えるソリューションを見つけてください。