繁体   English   中英

根据评级标准扩展sql查询以选择前两行?

[英]expanding sql query for selecting top two rows based on rating criteria?

我正在做一些练习来获得我的sql基础知识。 我被困在这里,无法取得任何进展。 如果我能获得有关如何分解复杂查询的提示,我将非常感激,如下所示:

有三个表:

电影(mID,标题,年份,导演) - 有一部电影的ID号为mID,标题,发行年份和导演。

审稿人(rID,姓名) - ID号为rID的审稿人具有特定名称。

评级(rID,mID,stars,ratingDate) - 评论者rID在某个评级日期给予电影mID一些评级(1-5)的星级。

问题是 :

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

这是我的尝试:

select distinct temp1.ID FROM (select * FROM  
(select rID, name,title twos FROM
(select r.rID , rev.name, m.title, count(*) as twos from reviewer rev
JOIN rating r on r.rID=rev.rID
JOIN movie m on m.mID=r.mID
GROUP BY rev.rID) counts where counts.twos=2) result, rating r 
where result.rID=r.rID ORDER BY ratingDate DESC) TEMP temp1
INNER JOIN TEMP temp2 
ON temp1.rId = temp2.rId AND temp1.ratingDate > temp2.ratingDate
WHERE temp1.stars > temp2.stars;

我迭代地构建这个查询。 但它没有给出正确的解决方案。 所以我想知道如何解决这类问题。 这不是家庭作业。我在这里做在线教程。

谢谢

在SQL中,它有助于集合思考。 例如,您可以选择存在较低评级的早期评论的评论集:

select  Reviewer.name
,       Movie.title
from    Rating
join    Reviewer 
on      Reviewer.rID = Rating.rID
join    Movie
on      Movie.mID = Rating.mID
where   exists
        (
        select  *
        from    Rating prev
        where   prev.mID = Rating.mID
                and prev.rID = Rating.rID
                and prev.ratingDate < Rating.ratingDate
                and prev.stars < Rating.stars
        )

这是一个非常好的课程顺便说一句!

首先,您获得具有重复mIDrID组合的行。 然后将其JOIN Rating ,看看给出的第二star是否高于第star 然后JOIN MovieReviewer ,获取评论者姓名和电影片名。

SELECT
    rv.name,
    m.title
FROM (
    SELECT
        rID, mID
    FROM Rating
    GROUP BY rID, mID
    HAVING COUNT(*) = 2
)t
INNER JOIN Rating r
    ON r.rID = t.rID
    AND r.mID = t.mID
INNER JOIN Rating r2
    ON r2.rID = r.rID
    AND r2.mID = r.mID
    AND r2.ratingDate > r.ratingDate
INNER JOIN Movie m
    ON m.mID = r.mID
INNER JOIN Reviewer rv
    ON rv.rID = r.rID
WHERE
    r2.stars > r.stars

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM