Forudsat at du er interesseret i at placere @Guests
fra @StartDate
til @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
skal give dig en liste over alle værelser, der er gratis og kan rumme et givet antal gæster i den givne periode.
NOTER
Denne forespørgsel virker kun for enkeltværelser, hvis du vil se på flere rum, skal du anvende de samme kriterier på en kombination af værelser. Til dette har du brug for rekursive forespørgsler eller nogle hjælpetabeller. COALESCE er der også for at tage sig af NULLs - hvis et værelse slet ikke er booket, ville det ikke have nogen poster med datoer at sammenligne med, så det ville ikke returnere helt gratis værelser. Dato mellem dato1 og dato2 vil returnere NULL, hvis enten dato1 eller dato2 er nul, og sammensmeltning vil gøre det til sandt (alternativet er at lave en UNION af helt gratis værelser, hvilket kan være hurtigere).
Med flere rum bliver tingene virkelig interessante. Er det scenarie en stor del af dit problem? Og hvilken database bruger du, dvs. har du adgang til rekursive forespørgsler?
REDIGER
Som jeg har nævnt flere gange før, er din måde at lede efter en løsning på (grådig algoritme, der ser på de største ledige værelser først) ikke den optimale, hvis du ønsker at få den bedste pasform mellem det nødvendige antal gæster og værelser.
Så hvis du erstatter din foreach med
$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);
Vil gennemgå alle mulige kombinationer og find den løsning, der spilder det mindste antal pladser.