Matriz de búsqueda para todos los rectángulos de dimensiones dadas (seleccione bloques de asientos)

Todos

e estado tratando de averiguar cómo seleccionar, digamos, 15 boletos en un solo bloque de asientos.

EDITA: el problema es: ¿cómo encontrar todos los rectángulos de dimensiones dadas (por ejemplo, 3x5) de asientos libres?

La siguiente es mi tabla, y la consulta selecciona 4 asientos consecutivos (o 15 o lo que sea) lo cual está bien ...

Pero lo que quiero hacer es seleccionar digamos 15 asientos, estos se pueden dividir en varias filas, es decir, 3 x 5, pero me gustaría que se bloqueen juntos, es decir,

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

Es decir. serían 3 filas todas una frente a la otra. fila 9 asientos 10 a 25, fila 8 asientos 10 a 25, fila 7 asientos 10 a 25.

ambién puede ser necesario considerar si un bloque de asientos tiene un número variable de asientos, es decir, un bloque de esquina puede estar en un arco para tener más asientos en la parte posterior que en la parte delantera.

Cualquier guía en forma de sacrificar el SQL o algún algoritmo o algún código PHP. He estado destrozando mi cerebro durante la mayor parte de la semana ahora.

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;

Mi consulta hasta la fecha, que devuelve combinaciones de bloques de X asientos.

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

Gracias de antemano, necesita más información, ¡solo pregunte!

Respuestas a la pregunta(7)

Su respuesta a la pregunta