Удачи.

Я пытался понять, как выбрать, скажем, 15 билетов в одном блоке мест.

РЕДАКТИРОВАТЬ

: проблема в том, как найти все прямоугольники заданных размеров (скажем, 3х5) свободных мест?Ниже моя таблица, и запрос выбирает 4 последовательных места (или 15 или что-то еще), что хорошо ...

Но я хочу выбрать, скажем, 15 мест, они могут быть разбиты на несколько рядов, то есть 3 х 5, но я бы хотел, чтобы они были заблокированы вместе, т.е.

То есть они были бы 3 ряда все друг перед другом. ряд 9 мест от 10 до 25, ряд 8 мест от 10 до 25, ряд 7 мест от 10 до 25.

row 9 ..(some seats)..[5 seats]..(some seats)..
row 8 ..(some seats)..[5 seats]..(some seats)..
row 7 ..(some seats)..[5 seats]..(some seats)..

Также может потребоваться рассмотреть вопрос о том, может ли блок сидений иметь разное количество мест, т. Е. Угловой блок может быть по дуге, чтобы иметь больше сидений сзади, чем спереди.

Любое руководство в форме улучшения SQL или некоторого алгоритма или некоторого кода PHP. Я ломал свой мозг большую часть недели.

Мой запрос на сегодняшний день - который возвращает комбинации блоков X мест.

CREATE TABLE `seats` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `event_id` int(11) DEFAULT NULL,
  `performance` int(11) DEFAULT NULL,
  `block` int(11) DEFAULT NULL,
  `row` int(11) DEFAULT NULL,
  `seat` int(11) DEFAULT NULL,
  `status` int(10) DEFAULT 1,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;

Спасибо заранее, нужно больше информации, пожалуйста, просто спросите!

SELECT    a.event_id, a.performance, a.block,
          a.row, a.seat AS start_seat,
          a.seat + (4 - 1) AS end_seat,
          4 AS requested_seats,
          a.id AS start_allocation_id
FROM      seats a
          LEFT JOIN seats b ON
              a.event_id = b.event_id AND
              a.performance = b.performance AND
              a.block = b.block AND
              a.row = b.row AND
              a.seat < b.seat AND
              b.seat < a.seat + 4 AND
              b.status = 1
WHERE     a.status = 1 AND
          a.event_id = 1
GROUP BY  a.seat
HAVING COUNT(b.seat) + 1 = 4
ORDER BY performance

Я не уверен, что получил представление о том, что вы пытаетесь сделать и какова ситуация ... но как насчет применения маски (например, маски IP-подсети) доступных мест подряд? например