我有 3 張桌子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桌子
| 電影ID | 標題 | 年 | 導向器 |
|---|---|---|---|
| 101 | 隨風而逝 | 1939年 | 維克多·弗萊明 |
| 102 | 星球大戰 | 1977年 | 喬治盧卡斯 |
| 103 | 音樂的聲音 | 1965年 | 羅伯特·懷斯 |
| 104 | 外星人 | 1982年 | 史蒂文斯皮爾伯格 |
| 105 | 泰坦尼克號 | 1997 | 詹姆斯卡梅隆 |
| 106 | 白雪公主 | 1937年 | 空值 |
| 107 | 阿凡達 | 2009 | 詹姆斯卡梅隆 |
| 108 | 電影“奪寶奇兵 | 1981年 | 史蒂文斯皮爾伯格 |
rating桌子
| 審閱者 ID | 電影編號 | 星星 | 評級日期 |
|---|---|---|---|
| 201 | 101 | 2 | 2011-01-22 |
| 201 | 101 | 4 | 2011-01-27 |
| 202 | 106 | 4 | 空值 |
| 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 | 空值 |
| 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桌子
| 審閱者 ID | 姓名 |
|---|---|
| 201 | 莎拉·馬丁內斯 |
| 202 | 丹尼爾·劉易斯 |
| 203 | 布列塔尼哈里斯 |
| 204 | 邁克·安德森 |
| 205 | 克里斯杰克遜 |
| 206 | 伊麗莎白托馬斯 |
| 207 | 詹姆斯卡梅隆 |
| 208 | 阿什莉·懷特 |
預期結果
| 審稿人 | 標題 |
|---|---|
| 莎拉·馬丁內斯 | 隨風而逝 |
編輯:我正在使用 MySQL 版本 8.0.29
uj5u.com熱心網友回復:
采用:
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
這將僅回傳您擁有同一用戶多于一部電影的結果,根據 ratingDate,評分 Star 大于上一個
uj5u.com熱心網友回復:
我們不需要使用where inwithrating和joinwithrating
您可以嘗試使用lead視窗函式來獲取下一個開始每個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 提供
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/471384.html
下一篇:如何在MySQL中連接字串的值
