Bir pas. Yerine sana numarasını koymak ?. Hiçbir dizisi bulursa ilk şartı bir araya geldi dizisi, ya da NULL size koltuk sayısını verir.
SET @FOUND = 0;
SET @SEAT_MATCHED = NULL;
SELECT
IF(@FOUND < ?,
@FOUND := IF(status == 'Booked', 0, @FROM + 1),
@SEAT_MATCHED := IFNULL(@SEAT_MATCHED, seat_no)
)
FROM seats
ORDER BY seat_no
SELECT @SEAT_MATCHED;
Daha fazla okuma: Control Flow Functions, User Variables
Birkaç kayıtları incelendiğinde aralıkta varsa NB! Bu yaklaşım geçerlidir!
Update. Belki bir tamsayı olarak satırdaki rezerve koltuk bit maskesi saklayabilirsiniz. Örneğin, 16-koltukları için numarasını 36884 (1001000000010100 ikili olarak) anlamına gelir satır 3rd, 5th, 13th and 16th seats are booked. Bu MySQL yükü azaltacak. Ve sonra bu gibi kod yapabilirdi:
<?php
header('Content-Type: text/plain');
// data you get from DB
$seats = bindec('1001000000010100');
$num_seats = 16;
// calculate consecutive free seats
$seats_info = array();
for ($i = 0; $i < $num_seats; $i++, $seats >>= 1) {
if ($seats & 1) {
if (isset($first)) {
$seats_info[$first] = $i - $first;
unset($first);
}
}
else {
if (!isset($first)) {
$first = $i;
}
}
}
// output sequences
var_export($seats_info);
?>
Bu çıkışlar:
array (
0 => 2,
3 => 1,
5 => 7,
13 => 2,
)
0 1st koltuğu.