2

次のような評価というテーブルがあります

評価 | ピシド | ユーザー
   8 12 6
   7 12 6
   9 15 7
   5 16 7
   9 17 8
   10 2 8
   7 18 3
   10 22 12

picid に基づいて評価をグループ化したいのですが、ユーザーごとに最も評価の高い picid のみを選択します。私はすでにこのようなクエリを持っています:

SELECT *, AVG(rating) AS total FROM ratings
  GROUP BY picid ORDER by total DESC

現在、クエリは次のような情報を出力します。

評価 | ピシド | ユーザー
 7.5 12 6
   9 15 7
   5 16 7
   9 17 8
   10 2 8
   7 18 3
   10 22 12

したがって、picid に基づいて評価が正常にグループ化されますが、ユーザーごとに最高のものだけが必要です。次のような情報を出力したい:

評価 | ピシド | ユーザー
 7.5 12 6
   9 15 7
   10 2 8
   7 18 3
   10 22 12

ユーザーごとに最高評価の picid のみを許可する方法がわかりますか? これを行うためにクエリを変更するにはどうすればよいですか?

私が求めていることについてさらに明確にする必要がある場合はお知らせください。

4

2 に答える 2

3

(Picid,User)最初に各組み合わせの平均評価を計算し、次にその具体化された結果に対するグループごとの最大値を見つける必要があります。

SELECT Rating, PicID, User
FROM (
  SELECT   AVG(Rating) AS Rating, Picid, User
  FROM     ratings
  GROUP BY Picid, User
) t1 NATURAL JOIN (
  SELECT   MAX(Rating) AS Rating, User
  FROM     (
    SELECT   AVG(Rating) AS Rating, User
    FROM     ratings
    GROUP BY Picid, User
  ) t
  GROUP BY User
) t2

sqlfiddleで参照してください。

于 2012-09-14T23:06:33.387 に答える
1

これが最善の方法だとは思いませんが、うまくいきます:

SELECT MAX(total) as maxTotal, picid, User 
FROM 
   (SELECT *, AVG(rating) AS total 
    FROM ratings 
    GROUP BY picid 
    ORDER BY total DESC) as a 
GROUP BY User 
ORDER BY maxTotal desc;

このsqlfiddleを使用して、他のものを試すことができます。

于 2012-09-14T22:55:34.473 に答える