我的数据库中有三个表:

  • "Film",其中包含有关电影的详细信息
  • "Sale",其中包含关于放映电影的其他地方的详细信息
  • "Proiezioni",其中包含有关投影的详细信息,外部引用了前面两个表

这个问题涉及到只在"比萨"城放映的所有电影的片名.

select f.Titolo
from Film f
where not exists(select *
                 from Sale s, Proiezioni p
                 where p.xCodSala=s.CodSala AND f.CodFilm=p.xCodFilm AND Citta<>'Pisa');

这个解决方案的问题是,它给我提供了仅在"Pisa"中放映的电影,但也提供了根本没有放映的(未请求的)电影(不在表"Proiezioni"中).

您可以在下面找到表生成和填充(ddl)的代码.

expected output是唯一一行对应于电影标题"I Predatori"的"CodFilm = 'f03'".


create table Film (
    CodFilm char(6) not null,
    Titolo varchar(30) not null,
    AnnoProduzione int(4) null,
    Nazionalita varchar(20) null,
    Regista varchar(30) null,
    Genere varchar(15) null,
    PRIMARY KEY (CodFilm)
) engine=innodb;

create table Sale
(
    CodSala char(3) not null,
    Posti int(3) not null,
    Nome varchar(10) not null,
    Citta varchar(20) not null,
    PRIMARY KEY (CodSala)
) engine=innodb;

create table Proiezioni
(
    CodProiezione varchar(8) not null,
    xCodFilm char(6) not null,
    xCodSala char(3) not null,
    Incasso real not null,
    DataProiezione date not null,
    PRIMARY KEY (CodProiezione),
    FOREIGN KEY (xCodFilm) references Film (CodFilm) on delete cascade,
    FOREIGN KEY (xCodSala) references Sale (CodSala) on delete cascade
) engine=innodb;

insert into Film values
    ("f01", "Wall Street",1987,"Stati Uniti","Oliver Stone","Drammatico"),
    ("f02","Nothing Hill",1999,"Regno Unito","Roger Michell","Commedia"),
    ("f03","I Predatori",2020,"Italia","Pietro Castellitto","Commedia"),
    ("f04","Fight Club",1999,"Stati Uniti","David Fincher","Drammatico"),
    ("f05","Il mattino ha l'oro in bocca",2008,"Italia","Francesco Patierno","Drammatico"),
    ("f06","Basic Instinct",1992,"Stati Uniti","Paul Verhoeven","Thriller"),
    ("f07","About A Boy",2002,"Regno Unito","Paul Weitz, Chris Weitz","Commedia"),
    ("f08","Troy",2004,"Stati Uniti","Wolfgang Petersen","Azione"),
    ("f09","Platoon",1986,"Stati Uniti","Oliver Stone", "Guerra"),
    ("f10","Seven",1995,"Stati Uniti","David Fincher","Thriller");
    
insert into Sale values
    ("s01", 100, "Cineworld", "Roma"  ),
    ("s02", 125, "Madison"  , "Rieti" ),
    ("s03",  90, "UCI"      , "Milano"),
    ("s04", 110, "The Space", "Milano"),
    ("s05",  50, "Greenwich", "Pisa"  );
    
insert into Proiezioni values
    ("p01","f04","s01",250000.50,'2022-01-07'),
    ("p02","f08","s03",300000.95,'2022-01-07'),
    ("p03","f08","s05",90000.00,'2022-02-05'),
    ("p04","f02","s01",18000,'2022-03-18'),
    ("p05","f02","s02",35775.80,'2022-04-20'),
    ("p06","f01","s04",92500.40,'2022-05-10'),
    ("p07","f09","s03",430000.45,'2022-05-13'),
    ("p08","f09","s03",22000,'2022-05-14'),
    ("p09","f03","s05",66000,'2022-05-20'),
    ("p10","f01","s02",280000,'2022-05-22'),
    ("p11","f01","s02",70000,'2022-05-23'),
    ("p12","f04","s04",16500,'2022-05-25');

推荐答案

你应该先把"film"和"proiezioni"连在一起,这样你就可以保证得到放映的电影.然后,您可以排除电影在除"Pisa"之外的任何城市放映的所有其他城市,该城市将只输出在比萨岛放映的电影.

SELECT DISTINCT f.Titolo
FROM       Film       f
INNER JOIN Proiezioni p
        ON f.CodFilm = p.xCodFilm 
WHERE p.xCodFilm NOT IN (SELECT p.xCodFilm 
                         FROM       Proiezioni p 
                         INNER JOIN Sale       s
                                 ON p.xCodSala = s.CodSala
                         WHERE s.Citta <> 'Pisa')

判断演示here.

Mysql相关问答推荐

MySQL 8.0.34-从后端系统管理AWS RDS上的持久连接内存使用

表列中的SQL SUM MENY值记录单个查询

为什么嵌套循环逻辑不能按预期工作

mysql 代码给我的外键格式不正确

在 mySQL 中计算每日数组的每周指标

如何在 SQL 中迭代所有名称和排名排列

Mysql根据文本语言或行数将列拆分为多列

如何使用mysql更新列中的json数据

谁能帮我优化where子句

MYSQL如何将虚拟列添加到现有表中

MYSQL 或 Laravel Eloquent 如何从这个订单中统计细节

在 WHERE 子句中使用 CASE

如何在mysql select查询中获取两个日期之间的日期列表

默认为空字符串的列

mysqli_fetch_array() 期望参数 1 为 mysqli_result,布尔值

外键可以引用非唯一索引吗?

Sequelize Query 查找日期范围内的所有记录

Ubuntu 中的 MySQL JDBC jar 文件在哪里?

启用 NO_BACKSLASH_ESCAPES 选项时如何转义文字百分号?

MySQL - 错误 1045 - 访问被拒绝