我目前正在上斯坦福大学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>
我的结果是空的。 (错误)我在做错什么,有人可以向我解释一下,以便我理解其背后的逻辑吗?在此先感谢您!
答案 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
。
然后过滤结果,以使审阅者不会与自己配对,并使用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
答案 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