斯坦福大学自定进度的SQL问题课程:
对于所有审阅者对同一电影进行评分的两个审阅者,返回两个审阅者的姓名。剔除重复项,不要将评审者与自己配对,每对评审者只包含一次。对于每一对,按字母顺序返回该对中的姓名。
该架构:
Movie ( mID, title, year, director )
有一部电影,ID号为MID,片名,上映年份和导演。
Reviewer ( rID, name )
ID号为RID的审阅者有一个特定的名字。
Rating ( rID, mID, stars, ratingDate )
影评人RID在某一天给了这部电影MID星级(1-5)。
我的尝试是:
Select R.Name, R2.Name
From Reviewer R
Join Reviewer R2 on (R.rID = R2.rID)
Join Rating Rt on (Rt.rID = R2.rID)
Join Rating Rt2 on (Rt2.rID = R.rID)
Where Rt.MID = Rt2.mID and R.rID < r2.rID
我知道我需要有一个包含2个审阅者姓名列和2个电影列的表。我应用的条件是电影必须彼此相等,并且ID不能与问题所说的相同:不要将评论者与他们自己配对,并且每对只能包括一次。
我的结果为空(不正确)。我做错了什么?
9条答案
按热度按时间k10s72fa1#
您必须将表
rating
联接两次到表movie
,对于每次联接,必须联接表reviewer
。然后过滤结果,使审阅者不与自己配对,并通过使用
distinct
和min()
和max()
函数确保每一对不重复:hc8w905p2#
我会从评级时的自我加入开始,然后引入以下名称:
您的查询实际上非常相似。我认为主要的问题是
select distinct
和按名称排序,而不是id
。rwqw0loc3#
fd3cxomn4#
正确答案
3hvapo4f5#
以下是我的解决方案:
避免使用DISTINCT总是好的。使用ID连接表总是很好的,在此之后,使用一些条件进行排序,比如名称
l2osamch6#
pdtvr36n7#
34gzjxbg8#
uqdfh47h9#