Dengan asumsi Anda tertarik untuk menempatkan @Guests
dari @StartDate
ke @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
harus memberi Anda daftar semua kamar yang gratis dan dapat menampung jumlah tamu tertentu selama periode tertentu.
CATATAN
Kueri ini hanya berfungsi untuk satu kamar, jika Anda ingin melihat beberapa kamar, Anda perlu menerapkan kriteria yang sama untuk kombinasi kamar. Untuk ini, Anda akan memerlukan kueri rekursif atau beberapa tabel pembantu. Juga, COALESCE ada untuk menangani NULL - jika kamar tidak dipesan sama sekali, itu tidak akan memiliki catatan dengan tanggal untuk dibandingkan, sehingga tidak akan kembali sepenuhnya gratis kamar. Tanggal antara date1 dan date2 akan mengembalikan NULL jika date1 atau date2 adalah null dan penggabungan akan mengubahnya menjadi true (alternatifnya adalah melakukan UNION kamar yang sepenuhnya gratis; yang mungkin lebih cepat).
Dengan banyak ruangan, semuanya menjadi sangat menarik. Apakah skenario itu bagian besar dari masalah Anda? Dan database mana yang Anda gunakan yaitu apakah Anda memiliki akses ke kueri rekursif?
EDIT
Seperti yang saya nyatakan beberapa kali sebelumnya, cara Anda mencari solusi (algoritma serakah yang melihat kamar gratis terbesar terlebih dahulu) tidak optimal jika Anda ingin mendapatkan yang paling sesuai antara jumlah tamu dan kamar yang dibutuhkan.
Jadi, jika Anda mengganti foreach Anda dengan
$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);
Akan melalui semua kemungkinan kombinasi dan temukan solusi yang menghabiskan paling sedikit ruang.