1

私は2つのテーブルを持っています:

レシピ

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列があることも問題ありません。正しく表示するかどうかは、クライアント側に任されています。

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

MyRatingnullでないかどうかを表示したい場合AverageRatingは、関数を確認できますCOALESCE

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

また、INNERJOINをLEFTJOINに変更して、評価のないレシピを結果に表示できるようにしました。

于 2012-05-15T19:33:03.873 に答える