我目前正在做斯坦福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
然后过滤结果,以使审阅者不会与自己配对,并通过使用distinctmin()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

09-11 08:45