I have 3 tables movie, rating and reviewer
movie has 4 columns movieID, title, year, director
rating has 4 columns reviewerID, movieID, stars, ratingDate
reviewer has 2 columns reviewerID, name
How do I query reviewer who rated the same movie more than 1 time and gave it higher rating on the second review.
This is my attempt at query to find rows with duplicate values in 2 columns (meaning the movie has been rated by 1 reviewer more than once), and then somehow I need to query reviewer who gave higher stars on second review.
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 |
Expected result
| Reviewer | Title |
|---|---|
| Sarah Martinez | Gone with the Wind |
EDIT: I am using MySQL version 8.0.29
Advertisement
Answer
Use:
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
The key part is the EXISTS statement
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
which will return only the results on which you have the same user more than one movie, the rating Stars are bigger than the previos one based on the ratingDate