如何创建此 SQL 查询?

Roy*_*Roy 5 query

我正在参加斯坦福在线的免费 DB 课程,坦率地说,其中一项练习给我带来了一些麻烦。我有一种感觉,这应该非常简单,所以对于 DBA,我显然不太擅长 SQL。

我们正在使用一个简化的场景来评价电影。

对于同一评论者两次对同一部电影评分并第二次给予更高评分的所有情况,返回评论者的姓名和电影名称。

这是架构:

Movie ( mID, title, year, director ) 
Reviewer ( rID, name ) 
Rating ( rID, mID, stars, ratingDate ) 
Run Code Online (Sandbox Code Playgroud)

我应该怎么做?

Mik*_*Fal 4

您可以根据此类条件自连接到表(至少,我可以在 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)主键。