首页 文章

如何在MySQL中找到更好的电影评级平均值

提问于
浏览
1

我有一张 table 电影

id  release_year    category_id rating
1   2015                 1         8
2   2015                 2        8.5
3   2015                 3         9
4   2016                 2        8.2
5   2016                 1        8.4
6   2017                 2         7

我想添加一个新专栏“avg_better_films”来查找其发行年份中所有更好的电影的平均评分

输出应该是

id  release_year    category_id rating  avg_better_films
1   2015                1         8          8.75
2   2015                2        8.5           9
3   2015                3         9        Not Available
4   2016                2        8.2          8.4
5   2016                1        8.4       Not Available
6   2017                2         7        Not Available

而且你可以看到,当这部电影在发行年份获得最佳评级时,它将显示“不可用”

你知道如何在MySQL中获得这个输出吗?

3 回答

  • 0
    • 我们可以使用Correlated Subquery计算同年"better films"的平均评级 .

    • 如果没有更好的电影和一年的电影,子查询将返回 null .

    • 然后我们可以使用Coalesce()函数来处理当年没有找到"better film"的情况 .

    • 感谢@Strawberry的评论,我们需要对子查询的结果做 + 0 ,以便MySQL将其视为数字

    请尝试以下方法:

    SELECT
      t1.id, 
      t1.release_year, 
      t1.category_id, 
      t1.rating, 
      COALESCE(
               (
                SELECT AVG(t2.rating) 
                FROM Films AS t2
                WHERE t2.rating > t1.rating AND  -- higher rating films
                      t2.release_year = t1.release_year -- films from same year
               ) + 0, 
               'Not Available' -- handle null result of subquery
              ) AS avg_better_films
    FROM Films AS t1
    

    SQL Fiddle: http://sqlfiddle.com/#!9/4960ea/3

  • 1

    您可以尝试使用标量子查询

    select *, (select avg(rating) from Films b on a.release_year=b.release_year) as avg_film_Rating
    from Films a
    
  • 0

    这很棘手,因为您需要将结果输出为字符串,而不是数字 . 如果任何值是字符串,则所有值都必须为 .

    我会推荐一个相关的子查询,看起来像:

    SELECT f.*,
           (SELECT COALESCE(FORMAT(AVG(t2.rating), 2), 'Not Available)
                FROM Films f2
                WHERE f2.rating > f.rating AND 
                      f2.release_year = f.release_year
           ) AS avg_better_films
    FROM Films f
    

    笔记:

    • 表别名应该是表名的缩写 .

    • 如果没有行与子查询中的 WHERE 子句匹配,则 AVG() 返回 NULL . 因此, COALESCE() 可以在子查询中 .

    • FORMAT() 用于将平均评分转换为字符串 .

相关问题