2

我有一个名为 rating 的表,看起来像这样

评级 | 皮西德 | 用户
   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 回答