MySQL中SQL代码出现「Unknown Column」错误排查求助
问题解决:MySQL 1054 错误及逻辑修正
一、语法错误原因
你遇到的Error Code: 1054是因为MySQL执行顺序规则:WHERE子句在GROUP BY和聚合计算之前运行,此时Average IMDB Rating、Number of Movies这类聚合生成的别名还未被创建,自然无法被WHERE识别。必须使用HAVING子句过滤聚合后的分组结果——HAVING是在GROUP BY和聚合计算完成后才执行的,能识别聚合别名或直接使用聚合函数。
二、逻辑修正(匹配你的需求)
你的需求是“参演超8部IMDB评分低于8.0的电影”,但原代码逻辑是“所有参演电影的平均评分低于8,且总参演数>8”,这和需求不符。需要调整逻辑,专门统计每个演员参演的评分<8的电影数量,再筛选该数量超过8的记录。
三、修正后的代码(两种方案,均符合你的知识范围)
方案1:先筛选低评分电影,再统计参演数
SELECT CONCAT(FirstName, ' ', LastName) AS `Actors and Actresses`, COUNT(ma.CelebrityId) AS `Number of Low-Rated Movies`, ROUND(AVG(IMDBRating), 2) AS `Average IMDB Rating of Low-Rated Movies`, MIN(IMDBRating) AS `Minimum Rating`, SUM(NumVotes) AS `Total Votes` FROM movie INNER JOIN movieactor AS ma ON movie.MovieId = ma.MovieId INNER JOIN celebrity ON ma.CelebrityId = celebrity.CelebrityId WHERE IMDBRating < 8.0 -- 先筛选出评分低于8的电影 GROUP BY FirstName, LastName HAVING `Number of Low-Rated Movies` > 8 -- 用HAVING过滤统计后的数量 ORDER BY `Average IMDB Rating of Low-Rated Movies` ASC;
方案2:用CASE函数统计特定条件的电影数(保留全量电影数据时适用)
SELECT CONCAT(FirstName, ' ', LastName) AS `Actors and Actresses`, COUNT(ma.CelebrityId) AS `Total Movies`, COUNT(CASE WHEN IMDBRating < 8.0 THEN 1 END) AS `Number of Low-Rated Movies`, ROUND(AVG(IMDBRating), 2) AS `Average IMDB Rating`, MIN(IMDBRating) AS `Minimum Rating`, SUM(NumVotes) AS `Total Votes` FROM movie INNER JOIN movieactor AS ma ON movie.MovieId = ma.MovieId INNER JOIN celebrity ON ma.CelebrityId = celebrity.CelebrityId GROUP BY FirstName, LastName HAVING `Number of Low-Rated Movies` > 8 -- 过滤低评分电影数超8的演员 ORDER BY `Average IMDB Rating` ASC;
四、核心知识点总结
- WHERE与HAVING的区别:WHERE过滤原始行数据,不能用聚合函数或别名;HAVING过滤聚合后的分组结果,可直接使用聚合函数或其别名。
- CASE函数的统计用法:
COUNT(CASE WHEN 条件 THEN 1 END)能精准统计分组内符合条件的记录数,不符合条件的记录会返回NULL,不会被COUNT计入。
内容的提问来源于stack exchange,提问作者Kodi van Niel
相关产品推荐
相关产品推荐

