如何找到参与所有电影的人

Posted

技术标签:

【中文标题】如何找到参与所有电影的人【英文标题】:How to find persons participating in all the films 【发布时间】:2017-02-11 11:20:00 【问题描述】:

我无法制定以下查询来挽救我的生命:

谁参与了所有电影,哪些电影在所有电影院放映,哪些电影院放映了所有电影?

给定以下关系:

film: [ID, title, year, genre]
person: [ID, name, firstname]
cinema: [ID, name, city]
participation: [film, person, function ('actor', or 'director')]
show: [film, date, cinema]

其中电影、人物和电影是ParticipationShow 中的外键。

我也不确定是否需要 ALL 关键字,或者是否可以不使用它。

【问题讨论】:

什么查询?这可能会有所帮助。 就是这样,我无法表述,只能问他们:所有的电影都有谁参与?哪部电影在所有电影院放映?哪些电影院放映所有电影? 啊....好吧,那么让我建议一个编辑。 那个编辑有用吗? 好的,谢谢。 【参考方案1】:

谁参与了所有电影?

select person_id,count(*) as c 
from participation 
group by person_id 
having c = (select count(*) from film)

你现在应该没问题了,因为它是相同的程序。

我尝试了一下:sqlfiddle

【讨论】:

感谢您提供 sqlfiddle 链接!我不知道有这样的资源!【参考方案2】:

如何找到参与所有电影的人

一种方法是,为每个人统计该人参与的电影数量,然后与电影总数进行比较

SELECT person_id
FROM participation
GROUP BY person_id
HAVING count( distinct film_id ) = (
          SELECT count(*) FROM film
)

【讨论】:

【参考方案3】:

这些可以通过子查询来解决:

1) 谁参与了所有电影

Select ID
From person as P1
where not exists
   (select distinct id
    from film
    difference
    select distinct film_id
    from participation as P2
    where P2.person_Id = P1.Id)

子查询查找该人参与的所有电影,并获取所有电影的差值。如果这个人全部参与,那么结果将是一个空集。外部查询通过检查子查询是否返回一个空集来发现人们参与了所有电影。

该模式可用于回答其他查询。

【讨论】:

谢谢Manuel,这更像是我同学说的,你能解释一下not exits背后的原因以及它为什么起作用吗?对于“所有电影院都放映了哪部电影”这个问题,我得到了这样的信息:SELECT:title FROM:film WHERE:不存在(SELECT:* FROM:cinema WHERE 不存在(SELECT:* FROM:show WHERE:cinema.ID = 电影院和电影。ID = 电影)

以上是关于如何找到参与所有电影的人的主要内容,如果未能解决你的问题,请参考以下文章

AcWing103 电影 (排序 + 离散化)

MySQL:查找不参与关系的行

如何找到苹果应用名称的所有者

使用Promise.all删除所有ID

如何找到捆绑标识符的所有者

Python3爬虫你会怎么评价复仇者联盟4?