首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么这个SQL查询不能工作?CS50 Pset7 -电影

为什么这个SQL查询不能工作?CS50 Pset7 -电影
EN

Stack Overflow用户
提问于 2020-01-09 12:36:15
回答 1查看 7.6K关注 0票数 2

我目前正在处理这个https://cs50.harvard.edu/x/2020/psets/7/movies/,并试图完成9.sql。

有一个叫做“电影”的数据库,里面有表格:电影(列: id,标题,年份),人物(id,名字,出生)和明星(movie_id,person_id)。

任务是:

写一个SQL查询,列出所有在2004年上映的电影中主演的人的名字,按出生年份排序。它应该返回18,013个名字。

到目前为止,这就是我所做的

代码语言:javascript
运行
复制
SELECT count(distinct name) 
from people
join stars on stars.person_id = people.id
join movies on stars.movie_id = movies.id
WHERE year = 2004;

但是,这只会返回一个17,965的计数.

有人知道为什么会这样吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-09 13:08:25

如果你count(distinct person_id),那么你将得到18013。名字并不是唯一的,这是合理的。不合理的是考试中的指示说你应该只列出名字。

正确区分名称的一种方法是执行以下操作:

代码语言:javascript
运行
复制
SELECT p.name
from people p
where p.id in (
select distinct s.person_id
from stars s join movies m on s.movie_id = m.id
WHERE m.year = 2004)

如果您这样做,那么您甚至不需要distinct,因为in操作符的定义。但不管怎么说,你可能都会得到相同的执行计划。

在我看来,如果一个p.name属于另一个人,可以不止一次地列出它。如果规则以以下单词开头,那么您编写的查询就可以了:

如果一个人的名字..。

而不是这些词:

如果一个人..。

这让我想起了C. J.日期一天在课堂上做的事情。他在投影仪上放了一个铝箔,在墙上投射出一个烟斗的图像。然后他问:这是什么?

  • 一根管子,一个人说(可能是我)。
  • 另一个家伙说一张烟斗的照片。
  • 最后,有人说墙上有一根管子的图像。

因为它是一个数据库类,而不是一个物理类,没有人敢成为一个聪明的-a**。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59664139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档