SQL 根据2列查询重复行
SQL query for duplicate rows based on 2 columns
我有 3 tables movie
、rating
和 reviewer
movie
有 4 列 movieID
、title
、year
、director
rating
有 4 列 reviewerID
、movieID
、stars
、ratingDate
reviewer
有 2 列 reviewerID
、name
如何查询 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 in
与 rating
和 join
与 rating
一起使用
您可以尝试使用 lead
window 函数来获取下一个开始,每个 reviewerID
和 movieID
表示重复评级 (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
评分星星比之前的大
我有 3 tables movie
、rating
和 reviewer
movie
有 4 列 movieID
、title
、year
、director
rating
有 4 列 reviewerID
、movieID
、stars
、ratingDate
reviewer
有 2 列 reviewerID
、name
如何查询 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 in
与 rating
和 join
与 rating
您可以尝试使用 lead
window 函数来获取下一个开始,每个 reviewerID
和 movieID
表示重复评级 (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
评分星星比之前的大