【问题标题】:SQL query from www.db-class.com来自 www.db-class.com 的 SQL 查询
【发布时间】:2012-04-23 10:47:04
【问题描述】:

我正在解决 www.db-class.com 的练习。即使已经很晚了,问题仍然很有趣。我偶然发现了额外的最后一项任务,无法找出解决方案。

SQL方案如下:

create table Movie(mID int, title text, year int, director text);
create table Reviewer(rID int, name text); 
create table Rating(rID int, mID int, stars int, ratingDate date);

整个数据库可以获取here

问题如下:

Q12 对于每位董事,返回董事姓名以及 他们导演的获得最高评分的电影的标题 他们所有电影的评分,以及该评分的价值。 忽略导演为 NULL 的电影。

要提供更具体的细节,这里有什么问题:

一个查询

select m.mid, m.title, max(r.stars) as stars 
from rating r natural join movie m 
where m.director is NOT NULL group by m.mid

返回评分​​最高的电影的 ID:

101 Gone with the Wind       4
103 The Sound of Music       3
104 E.T.                     3
107 Avatar                   5
108 Raiders of the Lost Ark  4

另一个查询

select m.director, max(r.stars) as stars 
from rating r natural join movie m 
where m.director is NOT NULL group by m.director 

返回电影评分最高的导演姓名:

James Cameron       5
Robert Wise         3
Steven Spielberg    4
Victor Fleming      4

如何加入查询并为导演获取评分最高的电影的名称和星级:

James Cameron      Avatar                   5
Robert Wise        The Sound of Music       3
Steven Spielberg   Raiders of the Lost Ark  4
Victor Fleming     Gone with the Wind       4

【问题讨论】:

    标签: sql greatest-n-per-group


    【解决方案1】:

    在我看来,这只是一个 gretest-n-per-group 问题。甚至还有一个tag :)

    与典型情况的唯一区别是分组数据(主管)在一个表中,而用于进行比较的数据在另一个表中(星号)。因此,如果您查看标记为此类的问题,您应该会找到类似的示例。

    我建议您先解决它,假设您的所有数据都在一个表中(糟糕,但更容易解决......至少对我来说)。然后切换到拆分后的数据。

    剧透:

    我认为这是解决此问题的方法,因此请仅在您已经提出解决方案时再看一下。

    select distinct m1.director, m1.title, r1.stars from movie m1
    join rating r1 on m1.mID = r1.mID
    left join (
        select m2.director, r2.stars from movie m2
        join rating r2 on m2.mID = r2.mID
    ) s on m1.director = s.director and r1.stars < s.stars
    where s.stars is null and m1.director is not null
    

    【讨论】:

    • 该解决方案返回 NULL 导演并且没有获得头衔。没有头衔或没有导演的任务很简单,但如果两者都需要,那就更棘手了
    • 不是真的 :) 我添加了电影标题并删除了空导演(我不确定ignore movies whose director is NULL 是否意味着从结果中删除它们,所以以防万一,我这样做了)
    • 我找到了一个类似的解决方案,但它为所有电影提供了多个导演。答案显然要求每部电影每部电影最多(星级)一名导演
    • 真的,现在可以了。没有任何魔法。为什么我这么久都想不出解决办法?
    • 可能你没看过this :)
    【解决方案2】:

    建议:

    1. 创建一个列出所有董事的简单查询(简单)

    2. 进行“加入”,将每部电影及其导演链接到相应的评级

    3. 从第 2 步中选择“加入”,然后执行“group by”导演和“max(rating)”

    【讨论】:

    • 我做到了。它为所有电影提供了不止一位导演。答案显然要求每部电影最多(星级)一名导演。
    猜你喜欢
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 2012-10-28
    • 2015-11-20
    • 2021-01-08
    • 1970-01-01
    相关资源
    最近更新 更多