MySQL如何筛选年上映超2部电影的年份及解决only_full_group_by报错
报错原因
你当前数据库开启了sql_mode=only_full_group_by约束,该约束要求SELECT查询列表中所有非聚合字段,必须全部出现在GROUP BY子句中。你当前的查询按照release_year字段分组,但SELECT列表中包含了title字段,同一个上映年份对应多部不同的电影,分组后数据库无法确定你要取该年份下的哪条title数据,因此触发报错。
解决方案
根据你的实际需求选择对应修改方案即可:
方案1:仅查询符合条件的年份及对应电影数量(最贴合原始需求)
如果不需要获取具体电影名称,直接删除SELECT列表中的title字段即可:
SELECT COUNT(*) AS film_count, release_year FROM film GROUP BY release_year HAVING COUNT(title) > 2;
方案2:需要同时获取符合条件年份下的所有电影信息
先通过子查询筛选出上映电影超2部的年份,再关联原表匹配所有对应电影数据:
SELECT f.title, f.release_year FROM film f INNER JOIN ( SELECT release_year FROM film GROUP BY release_year HAVING COUNT(title) > 2 ) AS qualified_years ON f.release_year = qualified_years.release_year;
方案3:分组后需要展示该年份下的电影名称参考
可以用聚合函数包裹title字段,满足only_full_group_by约束:
- 拼接该年份下所有电影名称:
SELECT COUNT(*) AS film_count, GROUP_CONCAT(title SEPARATOR '、') AS all_film_titles, release_year FROM film GROUP BY release_year HAVING COUNT(title) > 2;
- 仅取该年份下任意一个电影名称作为示例:
SELECT COUNT(*) AS film_count, ANY_VALUE(title) AS sample_film_title, release_year FROM film GROUP BY release_year HAVING COUNT(title) > 2;
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

