我目前正在做斯坦福SQL自学课程,这是他们在问的问题。
问题:对于所有评论者都对同一部电影进行评级的所有评论者,请返回两个评论者的姓名。消除重复,不要将评论者与他们自己配对,并且每对仅包含一次。对于每对,请按字母顺序返回该对中的名称。
这是架构
Movie ( mID, title, year, director )
英语:有一部ID号为mID的电影,标题,发行年份和导演。
Reviewer ( rID, name )
英文:ID号为rID的审阅者有一个特定的名字。
Rating ( rID, mID, stars, ratingDate )
英语:审阅者rID在特定的ratingDate上为电影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个Reviewer Name列和2个Movie列的表。我应用了这样的条件,即电影必须彼此相等,并且Id不能与问题相同的条件表明不要将评论者与他们自己配对,并且每对仅包含一次。
我的结果是空的。 (不正确)我在做错什么,有人可以向我解释一下,以便我理解其背后的逻辑吗?在此先感谢您!
最佳答案
您必须将表rating
连接到表movie
两次,对于每次连接,都要连接表reviewer
。
然后过滤结果,以使审阅者不会与自己配对,并通过使用distinct
和min()
和max()
函数确保不会重复每对:
select distinct
min(v1.name, v2.name) reviewer1,
max(v1.name, v2.name) reviewer2
from movie m
inner join rating r1 on r1.mid = m.mid
inner join rating r2 on r2.mid = m.mid
inner join reviewer v1 on v1.rid = r1.rid
inner join reviewer v2 on v2.rid = r2.rid
where v1.rid <> v2.rid
order by reviewer1, reviewer2