SQL从另一个表中选择平均评分

Posted

技术标签:

【中文标题】SQL从另一个表中选择平均评分【英文标题】:SQL Selecting average of rating from another table 【发布时间】:2013-05-19 06:03:40 【问题描述】:

我有两个表:Anime_List 和 Anime_Reviews。

Anime_List 表有一个“Rating”字段,用于获取来自 Anime_Reviews 的平均评分。但是,Anime_Reviews 中不存在某些评分(行),因此我当前的查询仅返回具有平均评分的标题。

SELECT Anime_List.AnimeID, Anime_List.Name, Anime_List.AnimeImage, Anime_List.Synopsis, Anime_List.Type, Anime_List.Episodes, Anime_List.Genres, AVG(Anime_Reviews.Rating) 
FROM Anime_List INNER JOIN Anime_Reviews ON Anime_List.AnimeID = Anime_Reviews.AnimeID
GROUP BY Anime_List.AnimeID, Anime_List.Name, Anime_List.AnimeImage, Anime_List.Synopsis, Anime_List.Type, Anime_List.Episodes, Anime_List.Genres

如果 Anime_Reviews 中没有针对 Anime_List 中列出的每个标题的评分(行),我如何返回 0.0 的值?

【问题讨论】:

【参考方案1】:

使用子查询的版本

SELECT l.AnimeID, 
       l.Name, 
       l.AnimeImage, 
       l.Synopsis, 
       l.Type, 
       l.Episodes, 
       l.Genres, 
       (SELECT ISNULL(AVG(Rating), 0) Rating
          FROM Anime_Reviews 
         WHERE AnimeID = l.AnimeID)
  FROM Anime_List l

【讨论】:

这不是我想要的解决方案,因为它返回 2 列评分(因为那个 l.*),但无论如何谢谢。 是的,它现在可以工作了。我喜欢使用子查询比使用 COALESCE 更容易/更干净(在我的情况下)。 @MegaBubbletea 很高兴它有帮助。【参考方案2】:

LEFT JOINCOALESCE 一起使用:

SELECT 
  l.AnimeID, 
  l.Name, 
  l.AnimeImage, 
  l.Synopsis, 
  l.Type, 
  l.Episodes, 
  l.Genres, 
  COALESCE(AVG(r.Rating), 0) AS Rating 
FROM Anime_List AS l
LEFT JOIN Anime_Reviews AS r ON l.AnimeID = r.AnimeID
GROUP BY l.AnimeID, 
         l.Name, 
         l.AnimeImage, 
         l.Synopsis, 
         l.Type, 
         l.Episodes, 
         l.Genres;

有关不同类型 SQL 的更多信息JOIN 请参阅这篇文章:

A Visual Explanation of SQL Joins。

【讨论】:

以上是关于SQL从另一个表中选择平均评分的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中使用 ComboBox 从另一个 DataGridView 的 sql 表中选择数据名称?

SQL INNER JOIN - 根据另一行的值从另一个表中选择数据

从另一个表中选择一个表的否定以及oracle的主表sql查询中的数据

Laravel 查询构建器 - 从另一个表中选择前 1 行

根据带有参数的选择(唯一键)从另一个表中插入值

从一个表中选择,从另一个 id 链接的表中计数