Все,
Я пытался придумать, как выбрать, скажем, 15 билетов в одном блоке мест.
ИЗМЕНИТЬ : проблема в том, как найти все прямоугольники заданных размеров (например, 3x5) свободных мест?
Ниже приведена моя таблица, и запрос выбирает 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
Заранее спасибо, нужна дополнительная информация, спросите!