问题描述
我一直在尝试解决一个sqlite问题,其中有两个表:Movies
和movie_cast
。
电影具有以下列:id
,movie_title
和`score。这是数据示例:
- 11 |星球大战| 76.496
- 62 | 2001:太空漫游| 39.064
- 152 |开始跋涉| 26.551
movie_cast
具有以下列:movie_id
,cast_id
,cast_name
,birthday
,popularity
。这是一个示例。
-
11 | 2 |马克·哈米尔| 9/25/51 | 15.015
-
11 | 3 |哈里森·福特| 10/21/56 | 8.905
-
11 | 5 | Peter Cushing | 05/26/13 | 6.35
在这种情况下,movies.id
和movie_cast.movie_id
是相同的。
问题是查找平均电影得分最高的前十名演员。
平均分数计算中不要包括分数小于25的电影。
▪排除出演过两部或以下电影的演员。
我的查询如下,但似乎并没有找到正确的答案。
SELECT movie_cast.cast_id,movie_cast.cast_name,printf("%.2f",CAST(AVG(movies.score) as float)),COUNT(movie_cast.cast_name)
FROM movies
INNER JOIN movie_cast ON movies.id = movie_cast.movie_id
WHERE movies.score >= 25
GROUP BY movie_cast.cast_id
HAVING COUNT(movie_cast.cast_name) > 2
ORDER BY AVG(movies.score ) DESC,movie_cast.cast_name ASC
LIMIT 10
我得到的答案的格式为cast_id,cat_name,avg score。
-例如:3哈里森·福特52.30
我已经分析并重新分析了我的逻辑,但无济于事。我不确定我要去哪里。任何帮助将是巨大的! 谢谢!
解决方法
这就是我编写查询的方式:
SELECT mc.cast_id,mc.cast_name,PRINTF('%.2f',AVG(m.score)) avg_score
FROM movie_cast mc INNER JOIN movies m
ON m.id = mc.movie_id
WHERE m.score >= 25
GROUP BY mc.cast_id,mc.cast_name
HAVING COUNT(*) > 2
ORDER BY AVG(m.score) DESC,mc.cast_name ASC
LIMIT 10;
我为表使用别名来缩短代码并使其更具可读性。
无需将平均值强制转换为浮点数,因为SQLite中的平均值始终为实数。
两个COUNT(movie_cast.cast_name)
都可以简化为COUNT(*)
,但是SELECT
列表中的第1个不是您所需要的(如果需要,则将其添加)。
函数PRINTF()
返回一个字符串,但是如果您想返回一个数字,请使用ROUND()
:
ROUND(AVG(m.score),2) avg_score