Ervan uitgaande dat u geïnteresseerd bent om @Guests
. te plaatsen van @StartDate
naar @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
zou u een lijst moeten geven van alle kamers die vrij zijn en geschikt zijn voor een bepaald aantal gasten voor de opgegeven periode.
OPMERKINGEN
Deze zoekopdracht werkt alleen voor eenpersoonskamers, als u meerdere kamers wilt bekijken, moet u dezelfde criteria toepassen op een combinatie van kamers. Hiervoor hebt u recursieve vragen of enkele hulptabellen nodig. COALESCE is er ook om voor NULL's te zorgen - als een kamer helemaal niet is geboekt, heeft deze geen records met datums om mee te vergelijken, dus deze zou niet helemaal gratis terugkeren kamers. Datum tussen date1 en date2 retourneert NULL als date1 of date2 null is en samenvoegen verandert het in true (alternatief is het doen van een UNION van volledig vrije kamers, wat misschien sneller is).
Met meerdere kamers wordt het echt interessant. Is dat scenario een groot deel van uw probleem? En welke database gebruik je, d.w.z. heb je toegang tot recursieve zoekopdrachten?
BEWERKEN
Zoals ik al meerdere keren eerder heb aangegeven, is jouw manier van zoeken naar een oplossing (hebzuchtig algoritme dat eerst naar de grootste vrije kamers kijkt) niet optimaal als je de beste match wilt krijgen tussen het vereiste aantal gasten en kamers.
Dus, als u uw foreach vervangt door
$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);
Gaat door alle mogelijke combinaties en vind de oplossing die het minste aantal ruimtes verspilt.