我必须遵循架构
Movie(mvID, title, rating, year)
Director(directorID, firstname, lastname)
Genre(mvID*, genre)
Direct(mvID*, directorID*)
我需要知道指向喜剧类型的大部分电影的导演,并根据他们在该类型中制作的电影数量来输出他们的详细信息。
所以我有
SELECT Director.DirectorID, Director.FirstName, Director.LastName, COUNT(*)
FROM Direct, Genre, Director
WHERE Direct.mvID = Genre.mvID
AND Genre.genre = 'Comedy'
AND Direct.DirectorID = Director.DirectorID
AND COUNT(*) > ALL
GROUP BY Director.DirectorID, Director.FirstName, Director.LastName
ORDER by COUNT(*) DESC
但是我得到了一个不允许出错的群组功能。
答案 0 :(得分:0)
下面的SQL将解决您的问题:
SELECT Director.DirectorID, Director.FirstName, Director.LastName, COUNT(*)
FROM Direct, Genre, Director
WHERE Direct.mvID = Genre.mvID
AND Genre.genre = 'Comedy'
AND Direct.DirectorID = Director.DirectorID
AND rownum = 1
GROUP BY Director.DirectorID, Director.FirstName, Director.LastName
order by COUNT(*) DESC
具体来说,这会加入表格,并计算每个导演为“喜剧”类型的电影指导的电影。然后它按照count的降序对行进行排序并获取第一行。
请注意,你有两个很多< - >很多关系,所以如果你不只是看喜剧(即如果你跨多个类型运行),你可能不得不使用不同的技术(即多个临时表或类似的虚拟聚合),以便不在SQL中重复计算......
另请注意,如果两个导演拥有相同数量的此类型的电影,则只会返回一行。如果您希望返回所有具有相同喜剧数量的导演,则必须稍微修改sql。
干杯, Noah Wollowick
答案 1 :(得分:0)
select d.firstname,d.lastname,count(g.mvId)
from Director d
inner join Direct dr on d.directorId=dr.directorId
inner join Genre g on dr.mvId=g.mvId
where g.genre='comedy'
group by d.firstname
having count(g.mvId)=max(g.mvId)