Tengo un sistema de reserva en el que tengo que seleccionar cualquier habitación disponible de la base de datos. La configuración básica es:MySQL selecciona filas donde la fecha no está entre la fecha
table: room
columns: id, maxGuests
table: roombooking
columns: id, startDate, endDate
table: roombooking_room:
columns: id, room_id, roombooking_id
necesito para seleccionar las habitaciones que pueden caber los huéspedes solicitados en, o seleccionar dos (o más) habitaciones para adaptarse a los huéspedes en (según la definición de maxGuests, obviamente, con el más bajo/armario maxGuests primero)
pude bucle a través de mi rango de fecha y utilizar este 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
Dónde% $ 1 es la fecha y% bucle 2d es el número de invitados a ser reservado pero esto solo devuelve falso si hay más invitados que cualquier habitación puede tomar, y debe haber un rápido ker manera de hacer esto en lugar de bucle con php y ejecutar la consulta?
Esto es similar a una parte del sql que estaba pensando: Getting Dates between a range of dates pero con Mysql
solución, basada en la respuesta de 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'];
}
¿por qué tiene una tabla roombooking_room separada? no debe hacer una tabla de roombooking: id, room_id, startDate, endDate ser suficiente? – Axarydax
Creo que el SQL necesario para hacer lo que quiera sería, en términos realistas, demasiado complejo para lo que está tratando de lograr. ¿Qué hay de malo con el bucle y el uso de PHP? También puede encontrar que si logra el resultado deseado con SQL puro, esta solución puede de hecho ser más lenta que un bucle con PHP. Sin embargo, estaría muy interesado en ver los resultados, ya que a veces me hago una pregunta similar (PHP vs. SQL). –
@Axaryday, por favor vea el comentario en la respuesta a continuación. Es necesario porque un período de reserva puede tener más de una habitación asociada. Es decir, me quedo con 10 personas, una habitación puede llevar a 6 personas, por lo tanto, necesito dos habitaciones pero bajo la misma reserva – Ashley