从另一个数据表中选择平均评级

时间:2012-10-23 07:59:19

标签: sql select

我有3个数据表。

在条目数据表中,我有条目ID(entryId作为主键)。

我有另一个名为EntryUsersRatings的表,其中有多个条目具有entryId字段和一个评级值(从1到5)。  (对于一个entryId,评级被存储多次)。 列:ratingId(主键),entryId,rating(整数值)。

在第三个数据表中,我对第一个表中的条目进行了翻译(使用entryId,languageId和title - translation)。

我想要做的是从第一个数据表中选择所有条目及其标题(按语言ID)。 最重要的是,我想要存储在EntryUsersRatings中的每个条目的平均评级(可以多次存储)。

我试过这个:

SELECT entries.entryId, EntryTranslations.title, AVG(EntryUsersRatings.rating) AS AverageRating
FROM entries 
    LEFT OUTER JOIN
        EntryTranslations ON entries.entryId = EntryTranslations.entryId AND EntryTranslations.languageId = 1
    LEFT OUTER JOIN
        EntryUsersRatings ON entries.entryId = EntryUsersRatings.entryId
      WHERE entries.isDraft=0
    GROUP BY title, entries.entryId

isDraft只是意味着条目不会与所有需要的信息一起存储(只是不完整的数据 - 与我们的案例无关)。

非常感谢任何帮助。

编辑:我的解决方案为我提供了评分的空值。 Edit1:这个查询工作得很好,我正在查找错误的数据库。 我们也找到了另一种解决方案,它给了我们相同的结果(我希望有人会发现这很有用):

    SELECT entries.entryId, COALESCE(x.EntryUsersRatings, 0) as averageRating
    FROM entries  
    LEFT JOIN(
    SELECT rr.entryId, AVG(rating) AS entryRating 
    FROM EntryUsersRatings  rr 
    GROUP BY rr.entryId) x ON x.entryId = entries.entryId 

1 个答案:

答案 0 :(得分:0)

@Cyber​​Hawk:当您使用带有条目的左外连接时,您的结果将从左表和匹配记录中提供所有记录与右表中的连接条件。但是对于不匹配的记录,它会给你一个空值。

查看详情的以下链接:

http://msdn.microsoft.com/en-us/library/ms187518(v=sql.105).aspx