1

我有两张桌子:

食谱

食谱 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 列也很好,这将由客户端来正确显示。

4

1 回答 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它是否不为空,否则AverageRating您可以查看该COALESCE函数。

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

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

于 2012-05-15T19:33:03.873 回答