Ho un sistema di prenotazione in cui ho bisogno di selezionare qualsiasi stanza disponibile dal database. La configurazione di base è:MySQL seleziona le righe in cui la data non è compresa tra la data
table: room
columns: id, maxGuests
table: roombooking
columns: id, startDate, endDate
table: roombooking_room:
columns: id, room_id, roombooking_id
Ho bisogno di selezionare stanze che può andare bene gli ospiti richiesti, o selezionare due (o più) camere per soddisfare gli ospiti in (come definito da maxGuests, ovviamente utilizzando il più basso/armadio maxGuests prima)
potevo ciclo attraverso il mio intervallo di date e utilizzare questo sql:.
SELECT `id`
FROM `room`
WHERE `id` NOT IN
(
SELECT `roombooking_room`.`room_id`
FROM `roombooking_room`, `roombooking`
WHERE `roombooking`.`confirmed` =1
AND DATE(%s) BETWEEN `roombooking`.`startDate` AND `roombooking`.`endDate`
)
AND `room`.`maxGuests`>=%d
Dove% $ 1 è la data e l'% in loop 2d è il numero di ospiti per essere prenotato in Ma questo solo sarà restituisce false se ci sono più ospiti di quanti ne possa prendere una e ci deve essere un quic modo per farlo, piuttosto che fare un ciclo con php ed eseguire la query?
Questo è simile a una parte del SQL pensavo: Getting Dates between a range of dates ma con Mysql
soluzione, in base alla risposta del ircmaxwell:
$query = sprintf(
"SELECT `id`, `maxGuests`
FROM `room`
WHERE `id` NOT IN
(
SELECT `roombooking_room`.`room_id`
FROM `roombooking_room`
JOIN `roombooking` ON `roombooking_room`.`roombooking_id` = `roombooking`.`id`
WHERE `roombooking`.`confirmed` =1
AND (`roomBooking`.`startDate` > DATE(%s) OR `roomBooking`.`endDate` < DATE(%s))
)
AND `maxGuests` <= %d ORDER BY `maxGuests` DESC",
$endDate->toString('yyyy-MM-dd'), $startDate->toString('yyyy-MM-dd'), $noGuests);
$result = $db->query($query);
$result = $result->fetchAll();
$rooms = array();
$guests = 0;
foreach($result as $res) {
if($guests >= $noGuests) break;
$guests += (int)$res['maxGuests'];
$rooms[] = $res['id'];
}
perché hai una tabella roombooking_room separata? non dovresti scrivere roombooking: id, room_id, startDate, endDate essere abbastanza? – Axarydax
Penso che l'SQL necessario per fare ciò che vuoi sarebbe, in termini realistici, essere eccessivamente complesso per quello che stai cercando di ottenere. Cosa c'è di sbagliato con il ciclo e l'utilizzo di PHP? Potresti anche scoprire che se raggiungi il risultato desiderato con puro SQL, questa soluzione potrebbe essere più lenta del loop con PHP. Sarei molto interessato a vedere i risultati, tuttavia, a volte mi trovo a fare una domanda simile (PHP vs SQL). –
@Asaryday si prega di vedere il commento sulla risposta qui sotto. È necessario perché un periodo di prenotazione può avere più di una stanza associata. Vale a dire, sto con 10 persone, una stanza può ospitare 6 persone, quindi ho bisogno di due stanze ma sotto la stessa prenotazione – Ashley