电影预订:如何让每个节目都有自己的座位?

时间:2015-02-18 10:37:54

标签: sql eclipse mysql-workbench

我在mysql workbench(6.2)中制作了电影预订数据库。然后将该数据库连接到eclipse,我在java中编写了一个用于电影预订系统的GUI。

一切都适用于GUI /数据库,但有一个逻辑问题: 如果对节目进行预订,则自然地,在该剧院中将要播放该节目的座位数量将在每次预订时减少1。但如果有一个节目在不同日期,但在相同剧院,那么这个剧院座位也会减少1,这是错误的。

E.g。 星期一上的节目应该有自己的座位,星期二上的节目应该有自己的座位。一个解决方案可能是在'节目'中创建一个新的'nbrseats'列,但如果可能的话,我希望它能从剧院获得它的座位。

数据库

set foreign_key_checks = 0;
drop table if exists Users;
drop table if exists Theaters;
drop table if exists Movies;
drop table if exists reservations;
drop table if exists Shows;

create table Theaters ( 
    theatername char(11) not null,
    NbrSeats char(20) not null,
    primary key (theatername)
)engine innoDB;

create table Movies ( 
    moviename char(30) not null,
    primary key (moviename)
)engine innoDB;

create table Shows (   
    movieDate DATE not null,  
    theatername char(11) not null,  
    moviename char(30) not null,
    id integer auto_increment,

    foreign key (theatername) references Theaters(theatername),  
    foreign key (moviename) references Movies(moviename),
    primary key (id) 
)engine innoDB;

create table Users ( 
    username char(20) not null,
    fullname char(30) not null,
    phonenbr char(10) not null,
    address varchar(20) not null,

    primary key (username)
) engine innoDB;


create table reservations (
    resNbr integer auto_increment,
    username char(20) not null,
    showId int(30) not null,

    foreign key(showid) references Shows(id),
    foreign key (username) references Users(username),
    primary key (resNbr)
)engine innoDB;

-- insert data into the tables
insert into Users values
('Temp1','Name Name', '0701231231', 'Street1');

insert into Movies values
('Star Wars'),
('Dallas'),
('Falcon Crest');

insert into Theaters values
('Filmstaden', '100'),
('SF', '129'),
('Royal', '120');

insert into Shows values
('20151203','Royal', 'Falcon Crest', null),
('20151003','SF', 'Dallas', null),
('20150803','Filmstaden', 'Star Wars', null);

谢谢!

2 个答案:

答案 0 :(得分:1)

只需创建一个新列,即可在预订表中存储已预订的座位数。然后,您可以根据预订和此剧院可用的座位编写一个查询来计算免费座位数。

获得showid 1的免费席位的示例,有两个5座和2席的预订:

set foreign_key_checks = 0;
drop table if exists Users;
drop table if exists Theaters;
drop table if exists Movies;
drop table if exists reservations;
drop table if exists Shows;

create table Theaters ( 
    theatername char(11) not null,
    NbrSeats char(20) not null,
    primary key (theatername)
)engine innoDB;

create table Movies ( 
    moviename char(30) not null,
    primary key (moviename)
)engine innoDB;

create table Shows (   
    movieDate DATE not null,  
    theatername char(11) not null,  
    moviename char(30) not null,
    id integer auto_increment,

    foreign key (theatername) references Theaters(theatername),  
    foreign key (moviename) references Movies(moviename),
    primary key (id) 
)engine innoDB;

create table Users ( 
    username char(20) not null,
    fullname char(30) not null,
    phonenbr char(10) not null,
    address varchar(20) not null,

    primary key (username)
) engine innoDB;


create table reservations (
    resNbr integer auto_increment,
    username char(20) not null,
    showId int(30) not null,
    seats int not null,

    foreign key(showid) references Shows(id),
    foreign key (username) references Users(username),
    primary key (resNbr)
)engine innoDB;

-- insert data into the tables
insert into Users values
('Temp1','Name Name', '0701231231', 'Street1');

insert into Movies values
('Star Wars'),
('Dallas'),
('Falcon Crest');

insert into Theaters values
('Filmstaden', '100'),
('SF', '129'),
('Royal', '120');

insert into Shows values
('20151203','Royal', 'Falcon Crest', null),
('20151003','SF', 'Dallas', null),
('20150803','Filmstaden', 'Star Wars', null);

insert into reservations values
(null,'Temp1', 1, 5),
(null,'Temp1', 1, 2),
(null,'Temp1', 2, 3);


select
  Shows.id,
  Shows.theatername,
  Theaters.NbrSeats,
  sum(reservations.seats),
  Theaters.NbrSeats-sum(reservations.seats) freeseats
from Shows
  left join Theaters
  on Shows.theatername = Theaters.theatername
  left join reservations
  on Shows.id = reservations.showId
where Shows.id = 1
group by
  Shows.id,
  Shows.theatername,
  Theaters.NbrSeats

答案 1 :(得分:0)

数据库是正确的,这是一个查询的问题

这是id = 2的一个(有些原始的)示例查询:

select nbrseats - (select count(showId) from reservations 
where showId = (select id from shows where id = 2)) from theaters
where theatername = (select theatername from shows where id = 2);