web-dev-qa-db-ja.com

このSQLクエリが機能しないのはなぜですか? CS50 Pset7-映画

私は現在これを通して作業しています https://cs50.harvard.edu/x/2020/psets/7/movies/ と9.sqlを完了しようとしています。

「映画」と呼ばれるデータベースがあり、テーブルには映画(列:ID、タイトル、年)、人物(ID、名前、誕生)、星(映画ID、人物ID)があります。

タスクは次のとおりです。

sQLクエリを記述して、2004年にリリースされた映画に出演したすべての人の名前を、生年順に並べ替えます。 18,013個の名前が返されます。

これまでのところ、これは私がやったことです:

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のカウントのみを返します...

なぜこれがそうなのか誰にも分かりますか?

2
tarkin1

count(distinct person_id)の場合、18013を取得します。名前が一意でないことは合理的です。不合理なのは、名前だけを記載する必要があるという試験の指示です。

名前を正しく区別する1つの方法は、これを実行することです。

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. Date ある日クラスでやった。彼は壁に喫煙パイプの画像を映し出すフォイルをプロジェクターに貼った。それから彼は尋ねました:これは何ですか?

  • パイプ、一人の男が言った(おそらく私)。
  • 別の男が言ったパイプの画像。
  • 最後に、誰かが壁に投影されたパイプの画像を言った。

これはデータベースクラスであり、物理学のクラスではなかったため、あえて賢い人になることはできませんでした。

6
Jeff Holt