【问题标题】:SQL Query selecting users personal rating, or if that doesn't exist the average ratingSQL 查询选择用户个人评分,或者如果不存在平均评分
【发布时间】:2012-05-23 08:46:46
【问题描述】:

我有两张桌子:

食谱

配方 ID |用户名 |姓名 |等等

食谱评分

RecipeRatingId |配方 ID|用户名 |评分|评论

我想选择一个食谱列表并包含平均评分。这样的事情会起作用:

SELECT
    Recipes.RecipeId,
    Name,
    AVG(RecipeRatings.Rating) AS AverageRating
FROM Recipes
INNER JOIN RecipeRatings
ON RecipeRatings.RecipeId = Recipes.RecipeId
GROUP BY Recipes.RecipeId, Recipes.Name
ORDER BY AverageRating DESC

但我真正想要的是获得平均或当前用户评分。如果用户自己评价更高或更低,我似乎不应该费心显示平均值。

所以给定一个参数@userId,有没有办法从RecipeRatings 表中选择食谱列表以及当前用户评分(如果有的话),否则是平均值(如果有的话)?

拥有AverageRating 和MyRating 列也很好,这将由客户端来正确显示。

【问题讨论】:

    标签: sql sql-server average rating


    【解决方案1】:

    你可以试试这个:

    SELECT
        R.RecipeId,
        R.Name,
        AVG(RR.Rating) AS AverageRating,
        MAX(CASE WHEN RR.UserId = @userId THEN RR.Rating END) AS MyRating
    FROM Recipes AS R
    LEFT JOIN RecipeRatings AS RR
    ON RR.RecipeId = R.RecipeId
    GROUP BY R.RecipeId, R.Name
    ORDER BY AverageRating DESC
    

    如果你想显示MyRating 不为空,否则AverageRating 你可以查看COALESCE 函数。

    COALESCE(MAX(CASE WHEN RR.UserId = @userId THEN RR.Rating END),
             AVG(RR.Rating) AS ActualRating
    

    我还将您的 INNER JOIN 更改为 LEFT JOIN,这样没有任何评级的食谱仍然可以显示在结果中。

    【讨论】:

    • 谢谢,这正是我所需要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多