我正在参加斯坦福在线的免费 DB 课程,坦率地说,其中一项练习给我带来了一些麻烦。我有一种感觉,这应该非常简单,所以对于 DBA,我显然不太擅长 SQL。
我们正在使用一个简化的场景来评价电影。
对于同一评论者两次对同一部电影评分并第二次给予更高评分的所有情况,返回评论者的姓名和电影名称。
这是架构:
Movie ( mID, title, year, director )
Reviewer ( rID, name )
Rating ( rID, mID, stars, ratingDate )
Run Code Online (Sandbox Code Playgroud)
我应该怎么做?
您可以根据此类条件自连接到表(至少,我可以在 SQL Server 中执行此操作):
SELECT
r.name,
m.title
FROM
rating rt
JOIN movie m ON (rt.mid = m.mid)
JOIN reviewer r on (rt.rid = r.rid)
JOIN rating rt2 on (rt.mid = rt2.mid and rt.rid = rt2.rid)
WHERE
rt.ratingDate > rt2.ratingDate
AND rt.stars > rt2.stars;
Run Code Online (Sandbox Code Playgroud)
请注意,我们正在将评级与其自身结合起来。这样我们就可以使用 WHERE 子句来查找 中rating
日期和星号都大于 中其他行的行rating
。
您可以在此处查看我在 SQL Fiddle 中构建的完整示例。
如果您想添加评论者对电影仅做出这 2 条评论的条件,您可以添加:
AND NOT EXISTS --- not exists
( SELECT *
FROM rating rt3 --- another rating
WHERE rt3.mid = m.mid --- for same movie
AND rt3.rid = r.rid --- by same reviewer
AND rt3.ratingDate <> rt2.ratingDate --- on different date
AND rt3.ratingDate <> rt1.ratingDate --- than the first 2 reviews
)
Run Code Online (Sandbox Code Playgroud)
这假设该Rating
表具有 (rID, mID, ratingDate)
主键。
归档时间: |
|
查看次数: |
2286 次 |
最近记录: |