sql >> Database >  >> RDS >> Mysql

MySQL selecteer rijen waar de datum niet tussen de datum ligt

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.



  1. Equivalent van MSSQL IDENTITY-kolom in MySQL

  2. Hoe download ik een bestand met PHP en Mysql DB

  3. Wat is PyMySQL en hoe verschilt het van MySQLdb? Kan het de implementatie van Django beïnvloeden?

  4. MySQL POW() Functie – Verhoog een waarde tot de kracht van een andere waarde