【问题标题】:SQL Access: how to obtain output involving multiple tables without running 2 queries?SQL Access:如何在不运行 2 个查询的情况下获得涉及多个表的输出?
【发布时间】:2015-04-16 22:08:45
【问题描述】:

我想找出某个年龄段(例如 20-30 岁)最流行的电影类型。我对 SQL 很陌生,如果我能得到任何帮助,我将不胜感激,如果这太小了,我们深表歉意。

此查询的相关表是:

FILM {FID (PK), ..., Film_Title}
MEMBER {MID (PK), ..., Date_of_Birth}
LIST {MID (FK), FID (FK)}
GENRE {GID (PK), Genre}
FILM_ACTOR_DIRECTOR_GENRE {FID (FK), ..., GID (FK)}

FILM 和 MEMBER 表应该是不言自明的,而 LIST 是 MEMBER 希望租借的电影的选择。它就像一个购物篮。每个成员只有一个列表,每个列表可以包含多部电影。 FILM_ACTOR_DIRECTOR_GENRE 包含属于每部电影的流派。每部电影只能有一种类型。

到目前为止,我已经设法得到一个显示:

Genre     # People Aged 20-30
-------   -------------------
Action             5
Comedy             4
Horror             2
etc.              etc.

但是,它涉及创建一个表,然后运行另一个查询。有没有一种方法可以在不运行 2 次单独查询的情况下获得特定年龄段中最受欢迎的类型?

我使用的两个查询是:

SELECT DISTINCT Genre.Genre_Name, Member.Date_of_Birth
INTO Genre_by_Age
FROM
((((Genre 
INNER JOIN Film_Actor_Director_Genre ON Genre.GID = Film_Actor_Director_Genre.GID)
INNER JOIN Film ON Film_Actor_Director_Genre.FID = Film.FID) 
INNER JOIN List ON Film.FID = List.FID)
INNER JOIN Member ON Member.MID = List.MID)
WHERE (((Member.[Date_of_Birth]) Between #4/16/1995# And #4/16/1985#));

使用我想要的信息创建新表,并且:

SELECT Genre_Name, COUNT(*) as Number_of_People_aged_20_to_30
FROM Genre_by_Age
GROUP BY Genre_Name
ORDER BY COUNT(*) DESC;

获得如上所示的输出。

有没有办法在不运行 2 个单独的查询的情况下获得上述结果?感谢您的宝贵时间!

【问题讨论】:

    标签: sql ms-access multiple-tables


    【解决方案1】:

    使用子查询怎么样?

    SELECT Genre_Name, COUNT(*) as Number_of_People_aged_20_to_30
    FROM (SELECT DISTINCT Genre.Genre_Name, Member.Date_of_Birth
          FROM ((((Genre 
          INNER JOIN Film_Actor_Director_Genre ON Genre.GID = Film_Actor_Director_Genre.GID)
          INNER JOIN Film ON Film_Actor_Director_Genre.FID = Film.FID) 
          INNER JOIN List ON Film.FID = List.FID)
          INNER JOIN Member ON Member.MID = List.MID)
          WHERE (((Member.[Date_of_Birth]) Between #4/16/1995# And #4/16/1985#))
         ) as t
    GROUP BY Genre_Name
    ORDER BY COUNT(*) DESC;
    

    【讨论】:

    • 嗨,我不知道如何重新激活这个线程,所以我只是在这里发表评论..如果我应该做其他事情,请告诉我。无论如何,我现在想将结果限制为仅显示前 5 个类型而不是所有类型。有可能这样做吗?我尝试使用SELECT TOP 5,但它实际上限制了人员列表和他们选择的电影,所以我最终得到动作 - 5,而不是动作 - 19,喜剧 - 10,等等
    • 新问题应作为新问题提出,而不是在评论中提出。
    【解决方案2】:

    我认为这应该可行:

    SELECT Genre.Genre_Name, count(Member.MID) as Number_of_People_aged_20_to_30
    FROM
    ((((Genre 
    INNER JOIN Film_Actor_Director_Genre ON Genre.GID = Film_Actor_Director_Genre.GID)
    INNER JOIN Film ON Film_Actor_Director_Genre.FID = Film.FID) 
    INNER JOIN List ON Film.FID = List.FID)
    INNER JOIN Member ON Member.MID = List.MID)
    WHERE (((Member.[Date_of_Birth]) Between #4/16/1995# And #4/16/1985#))
    GROUP BY Genre.Genre_Name
    ORDER BY count(Member.MID) DESC;
    

    【讨论】:

    • 我运行了这个查询并且出现了一个错误:“查询表达式'count(DISTINCT Member.MID)'中的语法错误(缺少运算符)”——不知道有什么问题?代码对我来说似乎是正确的......
    • 好的,显然 COUNT(DISTINCT) 不适用于 Access。 SELECT Genre.Genre_Name, count(Member.MID) as Number_of_People_aged_20_to_30 FROM (Select DISTINCT Member.MID FROM ((((Genre INNER JOIN Film_Actor_Director_Genre ON Genre.GID = Film_Actor_Director_Genre.GID) INNER JOIN Film ON Film_Actor_Director_Genre.FID = Film.FID) INNER JOIN List ON Film.FID = List.FID) INNER JOIN Member ON Member.MID = List.MID) WHERE (((Member.[Date_of_Birth]) Between #4/16/1995# And #4/16/1985#)) GROUP BY Genre.Genre_Name ORDER BY COUNT(*) DESC); 但错误:ORDER BY 子句 (COUNT(*)) 与 DISTINCT 冲突
    • 嗨,我不知道如何重新激活这个线程,所以我只是在这里发表评论..如果我应该做其他事情,请告诉我。无论如何,我现在想将结果限制为仅显示前 5 个类型而不是所有类型。有可能这样做吗?我尝试使用 SELECT TOP 5,但它实际上限制了人员列表和他们选择的电影,所以我最终得到动作 - 5,而不是动作 - 19,喜剧 - 10,等等
    猜你喜欢
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-25
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多