mysql - 如何解决这个特定的 SQL 查询?我的解决方案还返回不需要的值

标签 mysql sql

我的数据库中有三个表:

  • 电影”,其中包含有关电影的详细信息
  • 促销”,其中包含有关放映电影的影院的详细信息
  • 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');

这个解决方案的问题是,它给了我只在“比萨”放映的电影,而且还提供了根本没有放映的(非请求的)电影(不存在于表中“ Proiezioni”)。

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

预期输出只有一行对应于电影标题“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');

最佳答案

SELECT Film.Titolo
FROM Film
JOIN Proiezioni ON Film.CodFilm = Proiezioni.xCodFilm
JOIN Sale ON Proiezioni.xCodSala = Sale.CodSala
GROUP BY 1
HAVING COUNT(*) = SUM(Sale.Citta = 'Pisa')

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=ac20c252cd148b2c6a01ae7e76448103

关于mysql - 如何解决这个特定的 SQL 查询?我的解决方案还返回不需要的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72814208/

相关文章:

java - 如何使用 EJB 实体 bean 连接到 mysql 数据库?

mysql - rails : How to handle existing invalid dates in database?

mysql - 选择2列并合并数据

sql - Entity Framework 中的 FirstOrDefault 调用已缓存但数据库已更改

mysql - 如何获取同一列中两行的差异

java - 查询两张表的外键

sql - 如何仅在满足多个子句时返回一行

mysql - 从一种方法调用另一种方法

MySQL在没有足够结果时按时间限制查询

mysql触发器: check how much time left until timestamp column value expires