使用带内部连接的组查找列的平均值,然后过滤组

find an average of a column using group with inner join and then filtering through the groups

我一直在尝试解决一个 sqlite 问题,我有两个表:Moviesmovie_cast

电影有以下列:idmovie_title 和 `score。这是数据示例:

movie_cast 包含以下列:movie_idcast_idcast_namebirthdaypopularity。这是一个示例。

在这种情况下,movies.idmovie_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 Harrison Ford 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 列表中的第一个不是您的要求所需要的(如果是则添加它)。
函数 PRINTF() returns 一个字符串,但是如果你想返回一个数字然后使用 ROUND():

ROUND(AVG(m.score), 2) avg_score