sql >> Database teknologi >  >> RDS >> Mysql

MySQL vælg rækker, hvor dato ikke er mellem dato

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.



  1. MySQL - Styr hvilken række der returneres af en gruppe af

  2. Simpel Oracle-forespørgsel:literal svarer ikke til formatstreng

  3. Hvordan kontrollerer man SQL Server-databasekompatibilitet efter sp_dbcmptlevel er forældet?

  4. Ping en MySQL-server