Редактировать: Так как здесь я неправильно понял вопросы, SQL-оператор, который вернет все первое свободное место и количество смежных мест из первого свободного. На первом месте стоит больше свободных мест.
SELECT count(1) free,(
CASE status
WHEN "Booked" THEN
@prev:=NULL
ELSE
@prev:=COALESCE(cast(@prev as unsigned), seat_no)
END) first
FROM
(SELECT @prev:=null) f,
(SELECT seat_no, status FROM seats ORDER BY seat_no) seats
GROUP BY first
HAVING first>=0
ORDER BY 1 DESC, 2
Так что для вашего примера он вернется:
free | first
-----------
5 2
3 8
Если вас интересует только первое последовательное место, которое может соответствовать вашему запросу, и не более того, просто добавьте условие на количество свободных мест, поэтому, если вам нужно 3 места, добавьте free>=3
, это сделает:
SELECT count(1) free,(
CASE status
WHEN "Booked" THEN
@prev:=NULL
ELSE
@prev:=COALESCE(cast(@prev as unsigned), seat_no)
END) first
FROM
(SELECT @prev:=null) f,
(SELECT seat_no, status FROM seats ORDER BY seat_no) seats
GROUP BY first
HAVING first>0 AND free>=3
LIMIT 1
это выдаст:
free | first
------------
5 2