通过加入获得 SQL 的平均值

Get Average in SQL Through Join

我只是在玩 SQL,我正在尝试执行以下操作。

我有 2 个 table,这是它们的结构:

  1. Movies_metadata Movies

  2. 评分table: Ratings

由于一部电影有很多评级,我想做的是获取每部电影的平均评级并将其显示在仅在元数据 table 中可用的标题旁边。

这是我得到的,但显然我的 SELECT 声明的问题是它会 return 所有电影的平均值并显示每条记录:

SELECT
    (SELECT 
        AVG(rating)
    FROM 
        `movies-dataset.movies_data.ratings`) AS rating_avg,
    metadata.title,
    metadata.budget,
    metadata.revenue,
    metadata.genres,
    metadata.original_language,
    metadata.release_date
FROM 
    `movies-dataset.movies_data.Movies_metadata` AS metadata
INNER JOIN `movies-dataset.movies_data.ratings` AS ratings
    ON metadata.id = ratings.movieId
LIMIT 10

这是一个结果示例:

Result

我想我可以使用 GROUP BY,但是当我尝试时,我收到了一个错误

感谢您的帮助!

以下应该有效:

SELECT movies_metadata.title, AVG(ratings.rating)
FROM movies_metadata
LEFT JOIN ratings ON movies_metadata.id = ratings.movieID
GROUP BY movies_metadata.title

如果不唯一,您可以将 movies_metadata.title 换成 movies_metadata.id

LIMIT 函数和GROUP 函数可能相互冲突。尝试将平均评分作为内部连接的一部分,如下所示:

    SELECT
    ratings.averagerating,
    metadata.title,
    metadata.budget,
    metadata.revenue,
    metadata.genres,
    metadata.original_language,
    metadata.release_date
FROM `movies-dataset.movies_data.Movies_metadata` AS metadata
INNER JOIN (SELECT movieId, AVG(rating) averagerating FROM `movies-dataset.movies_data.ratings` GROUP by movieId) AS ratings
    ON metadata.id = ratings.movieId
ORDER BY ratings.averagerating
LIMIT 5

也许可以试试:

Select m.movieID, (r.rate_sum / r.num_rate) as avg_rating
From your_movies_table m
Left Join (select movie_id, sum(rating) as ‘rate_sum’, count(rating) as ‘num_rate’
From your_ratings_table
Group by movie_id) r
On m.movie_id = r.movie_id

我正在使用左连接,因为我不确定是否所有电影都至少被评级过一次。