2

私は3つのデータテーブルを持っています。

エントリ データ テーブルには、ID を持つエントリがあります (entryId を主キーとして)。

entryId フィールドと評価値 (1 から 5) を持つ複数のエントリがある EntryUsersRatings という別のテーブルがあります。(評価は 1 つの entryId に対して複数回保存されます)。列: ratingId (主キー)、entryId、評価 (整数値)。

3 番目のデータ テーブルには、最初のテーブルのエントリの翻訳があります (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 は、エントリが必要なすべての情報とともに保存されていないことを意味するものです (不完全なデータ - ここでは関係ありません)。

どんな助けでも大歓迎です。

編集:私のソリューションでは、評価にnull値が返されます。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 
4

1 に答える 1

0

@Cyber​​Hawk: エントリで左外部結合を使用しているため、結果は左テーブルのすべてのレコードと、右テーブルの結合条件に一致するレコードを返します。ただし、一致しないレコードの場合は null 値が返されます。

データについては、次のリンクを確認してください。

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

于 2012-10-23T08:48:36.430 に答える