对于所有评论者都对同一部电影进行评级的所有评论者,请返回两个评论者的姓名

时间:2019-03-15 00:55:41

标签: sql sqlite

我目前正在上斯坦福大学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不能与问题说的相同。不要将评论者与他们自己配对,并且每对只能包含一次。 < / p>

我的结果是空的。 (错误)我在做错什么,有人可以向我解释一下,以便我理解其背后的逻辑吗?在此先感谢您!

5 个答案:

答案 0 :(得分:1)

我将首先进行自我评等,然后输入名称

select distinct rv.name, rv2.name
from rating r1 join
     rating r2
     on r1.mid = r2.mid join
     reviewer rv1
     on rv1.rid = r1.rid join
     reviewer rv2
     on rv2.rid = r2.rid and rv.name < rv2.name;

您的查询实际上非常相似。我认为主要问题是select distinct以及按名称而不是ID进行排序。

答案 1 :(得分:1)

您必须将表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

答案 2 :(得分:1)

SELECT DISTINCT MIN(NAME),MAX(NAME) 
FROM (SELECT MID,NAME 
      FROM RATING R,REVIEWER R1 
      WHERE R.RID=R1.RID 
      GROUP BY MID,R.RID 
      ORDER BY MID,NAME)
GROUP BY MID 
ORDER BY MIN(NAME)

答案 3 :(得分:-1)

select r1.name n1, r2.name n2 from (
    select distinct a1.rid rid1, a2.rid rid2 from rating a1 inner join rating a2 on a1.mid = a2.mid 
    and not a1.rid = a2.rid
)r 
inner join reviewer r1 on r.rid1 = r1.rid
inner join reviewer r2 on r.rid2 = r2.rid
where r1.name < r2.name order by r1.name

答案 4 :(得分:-1)

select DISTINCT min(name) as rv1, max(name) rv2
from Rating r1, Reviewer
WHERE (SELECT COUNT(*) from Rating r2 WHERE r1.mID = r2.mID) > 1 and r1.rID = Reviewer.rID
GROUP by r1.mID
ORDER by rv1