首页 文章

SQL Query选择用户的个人评级,或者如果不存在平均评级

提问于
浏览
1

我有两张 table :

Recipes

RecipeId | UserId |名称|等等

RecipeRatings

RecipeRatingId | RecipeId | UserId |评级|评论

我想选择食谱列表并包括平均评分 . 像这样的东西会起作用:

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列也没关系,它将由客户端正确显示 .

1 回答

  • 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 ,如果它不是null,否则 AverageRating 你可以查看 COALESCE 函数 .

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

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

相关问题