【发布时间】:2016-04-07 07:15:45
【问题描述】:
这是斯坦福在线数据库课程练习中的一个问题。 找到平均评分最高的电影。返回这些电影标题及其平均评分。使用 SQLite。
我看到了其他人提出的解决方案,例如,
但我希望在这里了解的是我目前的解决方案在哪里以及为什么出错了。
电影分级表:
rID mID stars ratingDate
201 101 2 2011-01-22
201 101 4 2011-01-27
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
...
注意:mID代表电影ID,rID代表评论者ID,stars代表评论者排名。
我的第一个想法是获取每部电影的平均分数,使用代码如下:
Select mID, avg(stars) AS avg_stars
From Rating
Group by mID
生成的汇总表是
mID avg_stars
101 3.0
103 2.5
104 2.5
106 4.5
107 4.0
108 3.3
然后我想选择分数列的最大值和关联的 mID
Select mID, max(avg_stars) AS Max_score
From (
Select mID, avg(stars) AS avg_stars
From Rating
Group by mID) T
我希望得到:
mID Max_score
106 4.5
但相反,我得到:
mID Max_score
108 4.5
【问题讨论】:
-
您应该在第二个查询中添加另一个 group by 子句,即
Select mID, max(avg_stars) AS Max_score From ( Select mID, avg(stars) AS avg_stars From Rating Group by mID) Group By mID -
这应该用通用标准 SQL 或 RDBMS 特定语法来回答吗?
-
您似乎将 MySQL 用作 DBMS,它允许使用非标准语法:当您返回
mID而不将其添加到GROUP BY时,MySQL 返回具有最大值(平均值)和随机 mID 值。 -
您好,dnoeth,您的解释听起来很合理。但添加 Group By 似乎不起作用。我的 DBMS 是 SQLite。您的解决方案是否适用于 MySQL 但不适用于 SQLite?