All
Я пытался понять, как выбрать, скажем, 15 билетов в одном блоке мест.
РЕДАКТИРОВАТЬ : проблема в том, как найти все прямоугольники заданных размеров (например, 3x5) свободных мест?
Ниже моя таблица, и запрос выбирает 4 последовательных места (или 15 или что-то еще), что хорошо ...
Но я хочу выбрать, скажем, 15 мест, они могут быть разбиты на несколько рядов, то есть 3 х 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 ряда все друг перед другом. ряд 9 мест от 10 до 25, ряд 8 мест от 10 до 25, ряд 7 мест от 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
Заранее спасибо, нужна дополнительная информация, пожалуйста, спросите!