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