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

时间:2018-11-16 10:05:11

标签: mysql sql database

我有一张桌子 电影

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 :(得分:1)

  • 我们可以使用Correlated Subquery来计算同一年“最佳影片”的平均评分。
  • 在特定电影和年份没有更好的电影的情况下,子查询将返回null
  • 然后我们可以使用Coalesce()函数来处理当年没有发现“更好的电影”的情况。
  • 感谢注释中的 @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小提琴: http://sqlfiddle.com/#!9/4960ea/3

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

我会建议一个相关的子查询,如下所示:

If rd.Read() Then
            If rd.GetString(4) = "small" Then


                MessageBox.Show("small")


            ElseIf rd.GetString(3) = "Big" Then

                MessageBox.Show("big")
            End If
        End If

注意:

  • 表别名应为表名称的缩写。
  • 如果没有行与子查询中的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()用于将平均评分转换为字符串。