SQL:如何找到用户观看最多的电影类型? (IMDb 个人项目)

SQL: How do I find which movie genre a user watched the most? (IMDb personal project)

我目前正在做一个个人项目,需要一些帮助。场景如下:

我正在为我自己和一些朋友看过的所有电影创建一个数据库 (MS Access)。我们在 IMDb 上对我们所有的电影进行评级,并使用导出功能获取所有电影数据和我们的电影评级。我打算对 Excel 做一些总结分析。我感兴趣的一件事是每个人观看的最常见的电影类型。以下是我目前的情况。请注意,"const" 列是电影的唯一 ID。我还有每个人的评分 table,下面的 table 是摘要 table,它们构成了我们看过的所有电影的组合。

这是我的table:http://imgur.com/v5x9Dhg

我为每个流派分配了一个 ID,如下所示:http://imgur.com/aXdr9XI

这里是一个 table,其中我为每个电影 ID 和一个独特的类型设置了单独的实例:http://imgur.com/N0wULo8

我想找到一种方法来统计每个人观看的所有类型。有什么建议吗?我很乐意提供您需要的任何其他信息!

谢谢!

您至少需要一个 table,每个 userconst(观看的电影)各占一行。在第 3 个示例 tables 中,您 posted 没有显示谁看过哪些电影,这是您解决问题所需的信息。你提到有 "individual tables for each person's ratings," 所以我假设你有那个信息。你会想要将它们全部组合成一个名为 PERSON_MOVIE 或类似名称的 table。

假设您的第二个 table 名为 GENRE,其列为 ID、流派。

假设您的第三个 table 名为 GENRE_MOVIE,其列为 Const 和 ID(ID 对应于 GENRE table 上的 ID)

假设第四个 table,您没有 post,但它是必需的,称为 PERSON_MOVIE,它的列是 person、Const、rating。

然后您可以编写这样的查询:

select vw1.*, ge.genre
  from (select um.person, gm.id as genre_id, count(*) as num_of_genre
          from user_movie um
         inner join genre_movie gm
            on um.const = gm.const
         group by um.person, gm.id) vw1
 inner join (select person, max(num_of_genre) as high_count
               from (select um.person, gm.id, count(*) as num_of_genre
                       from user_movie um
                      inner join genre_movie gm
                         on um.const = gm.const
                      group by um.person, gm.id) x
              group by person) vw2
    on vw1.person = vw2.person
   and vw1.num_of_genre = vw2.high_count
 inner join genre ge
    on vw1.genre_id = ge.id

编辑回复:您的评论:

所以现在您有多个 table 反映人们对电影的评分。您需要将它们组合成一个名为 PERSON_MOVIE 的 table 或类似的东西(如上例所示)。

table 上将有 3 列:person、const、rating

我不确定访问是否支持传统的 create table as select 查询,但通常您可以通过以下方式构建这样的 table:

create table person_movie as
select 'Bob', const, [You rated]
from ratings_by_bob
union all
select 'Sally', const, [You rated]
from ratings_by_sally
union all
select 'Jack', const, [You rated]
from ratings_by_jack
....

如果不是,只需手动合并 table 并添加第三列,如图所示,指示每行反映的用户。然后你可以运行我的初始查询。