CS50 Pset7 movies任务:SQL查询结果不符问题求助
问题原因分析
你的查询结果比预期少,核心问题出在去重逻辑上:你用distinct name统计,会把同名的不同演员合并成一条记录,但这些是拥有不同person_id的独立个体,都符合“出演2004年电影”的条件,理应被分别计入结果。
举个实际场景的例子:数据库里可能存在两个都叫“John Doe”的演员,他们的person_id不同,且都参演了2004年的电影。你的count(distinct name)会把这两人算成1个,但实际上他们是两个独立的人,都应该被包含在结果里——这就是统计数比预期少的原因。
修正后的查询
要得到正确的18013条结果,你需要基于person_id(people表的唯一主键,每个ID对应唯一的人)去重,而非姓名。
验证正确数量的统计查询:
SELECT COUNT(DISTINCT people.id) FROM people JOIN stars ON stars.person_id = people.id JOIN movies ON stars.movie_id = movies.id WHERE movies.year = 2004;
符合任务要求的完整查询(列出姓名并按出生年份排序):
SELECT DISTINCT people.name FROM people JOIN stars ON stars.person_id = people.id JOIN movies ON stars.movie_id = movies.id WHERE movies.year = 2004 ORDER BY people.birth;
或者更严谨的写法(先通过子查询筛选出符合条件的演员ID,再关联取姓名):
SELECT people.name FROM people WHERE people.id IN ( SELECT DISTINCT stars.person_id FROM stars JOIN movies ON stars.movie_id = movies.id WHERE movies.year = 2004 ) ORDER BY people.birth;
这两种写法都能返回正确的结果,因为它们都是基于唯一的person_id筛选演员,不会因为同名错误合并记录。
内容的提问来源于stack exchange,提问作者tarkin1
相关产品推荐
相关产品推荐

