私は現在これを通して作業しています 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のカウントのみを返します...
なぜこれがそうなのか誰にも分かりますか?
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 ある日クラスでやった。彼は壁に喫煙パイプの画像を映し出すフォイルをプロジェクターに貼った。それから彼は尋ねました:これは何ですか?
これはデータベースクラスであり、物理学のクラスではなかったため、あえて賢い人になることはできませんでした。