我有两张桌子:Movies
和Reviews
。
Movies
包含以下列:ID,标题,流派,持续时间;
Reviews
包含ID,说明,Movie_ID(引用电影中的ID)和成绩。
我想以平均值显示电影的顶部。 (我想显示电影的标题及其平均成绩。)
我尝试了2个子查询:一个用于选择标题,另一个用于从评论中获取AVG(与电影一起加入),但我无法弄清楚如何将SELECT AVG(GRADE)...
的结果提供给{{ 1}}。
我正在尝试正确的方式吗?
SELECT TITLE FROM MOVIES ...
预期结果:
Movies
ID TITLE GENRE DURATION
1 Movie_name_1 Sci-fi 120
2 Movie_name_2 Comedy 100
3 Movie_name_3 Drama 140
4 Movie_name_4 Sci-fi 105
Reviews
ID Description Movie_id Grade
1 WOW 1 10
2 SUCH 2 9
3 Great 3 9
4 Amazing 2 10
5 Decent 4 7
6 Legendary 2 10
7 Waste 3 4
8 hmmm 1 6
答案 0 :(得分:2)
这应该可行,只需将FETCH
数字更改为您想要查看的行数
SELECT Title, AVG(Grade) Grade
FROM Movies M
JOIN Reviews R on R.Movie_ID = M.ID
GROUP BY Title
ORDER BY Grade DESC
FETCH FIRST 5 ROWS ONLY;
编辑:下面有更详细的说明
此查询的基础是:
SELECT Title, Grade
FROM Movies M
JOIN Reviews R on R.Movie_ID = M.ID
这将为您提供单个结果集中所需的所有信息。
接下来,您希望每部电影的平均Grade
Title
这是通过使用平均功能AVG()
和按Title
进行分组来完成的(因为你想要毕竟每个标题的平均成绩):
SELECT Title, AVG(Grade) Grade
FROM Movies M
JOIN Reviews R on R.Movie_ID = M.ID
GROUP BY Title
注意:Grade
中的第二个AVG(Grade) Grade
只是一个别名。 AVG(Grade)
没有列名,所以为简单起见,我们调用新的平均列Grade
。
您也可以将其写为AVG(Grade) as Grade
,这可能会让您更清楚。
接下来,您想先看一下最受欢迎的电影。我们使用ORDER BY
执行此操作。我们可以在此处引用我们的平均Grade
列:
SELECT Title, AVG(Grade) Grade
FROM Movies M
JOIN Reviews R on R.Movie_ID = M.ID
GROUP BY Title
ORDER BY Grade DESC --Referencing the averaged column, not the main column
最后但同样重要的是,您提到要查看顶部的 n 行。我们可以使用FETCH FIRST n ROWS ONLY
子句来执行此操作:
SELECT Title, AVG(Grade) Grade
FROM Movies M
JOIN Reviews R on R.Movie_ID = M.ID
GROUP BY Title
ORDER BY Grade DESC
FETCH FIRST 5 ROWS ONLY;
这里是最后一个版本,带有不同的别名,以便更清晰:
SELECT Title, AVG(Grade) Averaged_Grade
FROM Movies M
JOIN Reviews R on R.Movie_ID = M.ID
GROUP BY Title
ORDER BY Averaged_Grade DESC
FETCH FIRST 5 ROWS ONLY;