3

我正在解决 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);

整个数据库可以在这里获取

问题如下:

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
4

2 回答 2

2

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

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

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

剧透:

我认为这是解决此问题的方法,因此只有在您已经提出解决方案时才查看它。

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
于 2012-04-11T06:26:57.993 回答
0

建议:

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

  2. 做一个“加入”,将每部电影——连同它的导演——链接到相应的评级

  3. 从第 2 步中选择“加入”,然后进行“分组”导演和“最大(评级)”

于 2012-04-11T06:10:51.840 回答