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,每个 user
和 const
(观看的电影)各占一行。在第 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 并添加第三列,如图所示,指示每行反映的用户。然后你可以运行我的初始查询。
我目前正在做一个个人项目,需要一些帮助。场景如下:
我正在为我自己和一些朋友看过的所有电影创建一个数据库 (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,每个 user
和 const
(观看的电影)各占一行。在第 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 并添加第三列,如图所示,指示每行反映的用户。然后你可以运行我的初始查询。