SQL 根据2列查询重复行

SQL query for duplicate rows based on 2 columns

我有 3 tables movieratingreviewer

movie 有 4 列 movieIDtitleyeardirector

rating 有 4 列 reviewerIDmovieIDstarsratingDate

reviewer 有 2 列 reviewerIDname

如何查询 reviewer 谁对同一部电影评分超过 1 次,并在第二次评论时给予更高评分。

这是我尝试查询在 2 列中查找具有重复值的行(这意味着该电影已被 1 位评论者不止一次评分),然后我需要以某种方式查询 reviewer 谁给了更高的评价stars 第二次审核。

SELECT reviewer.name, movie.title, rating.stars, rating.ratingDate
FROM rating
INNER JOIN reviewer ON reviewer.rID = rating.rID
INNER JOIN movie ON movie.mID = rating.mID
WHERE rating.rID IN (SELECT rating.rID FROM rating GROUP BY rating.rID, rating.mID HAVING COUNT(*) > 1)
ORDER BY reviewer.name, rating.ratingDate;

movie table

movieID Title Year Director
101 Gone with the Wind 1939 Victor Fleming
102 Star Wars 1977 George Lucas
103 The Sound of Music 1965 Robert Wise
104 E.T. 1982 Steven Spielberg
105 Titanic 1997 James Cameron
106 Snow White 1937 null
107 Avatar 2009 James Cameron
108 Raiders of the Lost Ark 1981 Steven Spielberg

rating table

reviewerID movie ID Stars ratingDate
201 101 2 2011-01-22
201 101 4 2011-01-27
202 106 4 null
203 103 2 2011-01-20
203 108 4 2011-01-12
203 108 2 2011-01-30
204 101 3 2011-01-09
205 103 3 2011-01-27
205 104 2 2011-01-22
205 108 4 null
206 107 3 2011-01-15
206 106 5 2011-01-19
207 107 5 2011-01-20
208 104 3 2011-01-02

reviewer table

reviewerID Name
201 Sarah Martinez
202 Daniel Lewis
203 Brittany Harris
204 Mike Anderson
205 Chris Jackson
206 Elizabeth Thomas
207 James Cameron
208 Ashley White

预期结果

Reviewer Title
Sarah Martinez Gone with the Wind

编辑:我正在使用 MySQL 版本 8.0.29

我们不需要将 where inratingjoinrating

一起使用

您可以尝试使用 lead window 函数来获取下一个开始,每个 reviewerIDmovieID 表示重复评级 (order by ratingDate)

然后与你的逻辑进行比较,找到一个新的开始大于旧的开始。

SELECT DISTINCT r.Name,m.Title
FROM (
  SELECT reviewerID, 
         movieID,
         Stars,
         LEAD(Stars) OVER(PARTITION BY reviewerID, movieID ORDER BY ratingDate) n_start
  FROM rating 
) t1
INNER JOIN movie m ON t1.movieID = m.movieID
INNER JOIN reviewer r ON r.reviewerID = t1.reviewerID
WHERE Stars < t1.n_start

此样本数据sqlfiddle由@ErgestBasha提供

使用:

select re.Name,mo.Title
FROM (
      select reviewerID,movieID,ratingDate,Stars
      from rating r 
      where exists (select 1 
              from rating r1 
              where r1.reviewerID=r.reviewerID 
              and r.movieID=r1.movieID 
              and r.ratingDate>r1.ratingDate
              and r.Stars>r1.Stars
       )) as t1
inner join movie mo on t1.movieID=mo.movieID
inner join reviewer re on t1.reviewerID=re.reviewerID

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=0c5d850ee3393b054d9af4c4ac241d96

关键部分是EXISTS语句

where exists (select 1 
              from rating r1 
              where r1.reviewerID=r.reviewerID 
              and r.movieID=r1.movieID 
              and r.ratingDate>r1.ratingDate
              and r.Stars>r1.Stars 

这将 return 只有同一用户拥有不止一部电影的结果,根据 ratingDate

评分星星比之前的大