Учитывая в следующих таблицах:PostgreSQL оператор выбора
shows:
title | basic_ticket_price
----------------+--------------------
Inception | $3.50
Romeo & Juliet | $2.00
performance:
perf_date | perf_time | title
------------+-----------+----------------
2012-08-14 | 00:08:00 | Inception
2012-08-12 | 00:12:00 | Romeo & Juliet
booking:
ticket_no | perf_date | perf_time | row_no | person_id
-----------+------------+-----------+--------+-----------
1 | 2012-08-14 | 00:08:00 | P01 | 1
2 | 2012-08-12 | 00:12:00 | O05 | 4
3 | 2012-08-12 | 00:12:00 | A01 | 2
И дополнительная таблица: сиденье, которое содержит список мест, пронумерованных как и row_no в бронировании с именем области.
Сгруппировав заказанные места, используя следующее выражение:
select count(row_no) AS row_no,
area_name
from seat
where exists (select row_no
from booking
where booking.row_no = seat.row_no)
group by area_name;
, который производит:
row_no | area_name
--------+--------------
1 | rear stalls
2 | front stalls
Как я могу теперь использовать подсчитанные строки и AREA_NAME написать один оператор SQL для получения списка показывая имена шоу, даты и время выступлений, а также количество забронированных мест в каждой области?
Я попытался это:
select s.title,
perf_date,
perf_time,
count(row_no) AS row_no,
area_name
from shows s,
performance,
seat
where exists (select row_no
from booking
where booking.row_no = seat.row_no)
group by area_name,s.title,performance.perf_date,performance.perf_time;
Но он показывает повторяющиеся строки:
title | perf_date | perf_time | row_no | area_name
----------------+------------+-----------+--------+--------------
Romeo & Juliet | 2012-08-12 | 00:12:00 | 1 | rear stalls
Romeo & Juliet | 2012-08-14 | 00:08:00 | 2 | front stalls
Inception | 2012-08-12 | 00:12:00 | 1 | rear stalls
Inception | 2012-08-14 | 00:08:00 | 2 | front stalls
Inception | 2012-08-14 | 00:08:00 | 1 | rear stalls
Inception | 2012-08-12 | 00:12:00 | 2 | front stalls
Romeo & Juliet | 2012-08-14 | 00:08:00 | 1 | rear stalls
Romeo & Juliet | 2012-08-12 | 00:12:00 | 2 | front stalls
(8 rows)
Любая помощь с решением этого будут оценены.
Кроме того: вы упускаете условие соединения в вашей второй заявление. Это приведет к объединению карт между шоу, представлением и местом. Вы должны переписать это, используя 'JOIN ...' –
, пожалуйста, примите мои извинения, я использую psql, но пометил его также как mysql, так как большинство операторов было похоже на аналогичные выражения. –
Вы должны использовать серийный номер в качестве первичного ключа. Что делать, если вы получаете вторую комнату для показа фильмов?Вы не можете позволить двум фильмам одновременно, потому что они идентифицированы perf_date и perf_time. Или что делать, когда запланировано выполнение? Вы должны изменить несколько таблиц, что плохо. И небольшое предложение: я бы не стал повторять заголовок таблицы в именах столбцов. Иначе вы закончите с perf.perf_title - perf.title будет достаточно хорошим. –