SQL:列必须出现在GROUP BY子句中或在聚合函数中使用

时间:2018-03-19 02:42:44

标签: mysql sql

我正在做我希望对imdb数据库的修改版本进行相当简单的查询:

select primary_name, release_year, max(rating)
from titles natural join primary_names natural join title_ratings
group by year
having title_category = 'film' and year > 1989;

但是,我立即遇到"列必须出现在GROUP BY子句中或用于聚合函数。" 我已尝试过研究这一点但却得到了令人困惑的信息;我发现这个问题的一些例子看起来与我的结构完全相同,其他人说你必须对每一个选定的参数进行分组,这会使一个组的整个目的失败,因为我只想选择最大的条目每年。这个查询我做错了什么?

预期结果:包含3列的表格,显示每年评分最高的电影。

2 个答案:

答案 0 :(得分:0)

如果您希望每年最多输入,那么您应该这样做:

select r.*
from ratings r
where r.rating = (select max(r2.rating) where r2.year = r.year) and
      r.year > 1989;

换句话说,group by是编写此查询的错误方法。

我还强烈建议您忘记natural join存在。这是令人厌恶的。它使用公共列的名称进行连接。它甚至没有使用正确声明的外键关系。此外,您无法看到用于连接的列。

虽然我是它,但另一条建议是:在具有多个表引用的查询中限定所有列名。也就是说,在列名中包含表别名。

答案 1 :(得分:0)

如果要显示所有列,您可以使用用户窗口功能:

select primary_name, year, max(rating) Over (Partition by year) as rating
from titles natural 
join primary_names natural join ratings
where title_type = 'film' and year > 1989;