Матрица поиска для всех прямоугольников заданных размеров (выберите блоки мест)

Все,

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

ИЗМЕНИТЬ : проблема в том, как найти все прямоугольники заданных размеров (например, 3x5) свободных мест?

enter image description here

Ниже приведена моя таблица, и запрос выбирает 4 последовательных места (или 15 или что угодно), что нормально ...

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

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

Т. они будут в 3 ряда друг перед другом. сиденья row9 с 10 по 25, row8 с 10 по 25, row7 с 10 по 25.

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

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

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;

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

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

Заранее спасибо, нужна дополнительная информация, спросите!

15
задан TMS 8 September 2011 в 20:41
поделиться