分组依据 - 覆盖结果中每个组下决定行的默认行为

时间:2010-11-27 23:27:37

标签: mysql override aggregate-functions greatest-n-per-group

进一步扩展此问题Query to find top rated article in each category -

考虑相同的表 -

id | category_id | rating
---+-------------+-------
 1 |           1 |     10
 2 |           1 |      8
 3 |           2 |      7
 4 |           3 |      5
 5 |           3 |      2
 6 |           3 |      6

有一个表格文章,其中包含字段ID,评级(1-10的整数)和category_id(表示其所属类别的整数)。如果我有相同的目标来获得每个查询中评价最高的文章(这应该是结果): -

期望的结果

id | category_id | rating
---+-------------+-------
 1 |           1 |     10
 3 |           2 |      7
 6 |           3 |      6

原始问题的延伸
但是,运行以下查询 -

SELECT id, category_id, max( rating ) AS max_rating 
FROM `articles`
GROUP BY category_id

结果如下所示,除了id字段之外的所有内容都符合要求。我知道如何使用子查询来做到这一点 - 正如同一个问题所回答的那样 - Using subquery

id  category_id     max_rating
1    1                10
3    2                7
4    3                6

通用术语
 排除分组列(category_id)和评估列(返回聚合函数结果的列,如SUM()MAX()等 - 在本例中为max_rating),返回的值在其他字段中只是每个分组结果集下的第一行(在这种情况下按category_id分组)。例如。 id = 1的记录是category_id 1(id 1下category_id 1下的表中的第一个记录,因此会返回。

我只是想知道是否有可能以某种方式克服此默认行为以根据条件返回行?如果mysql可以对每个分组结果集执行计算(MAX()计数等),那么为什么它不能返回对应于最大分级的行。如果没有子查询,是否无法在单个查询中执行此操作?这看起来像是经常要求。

更新
我也无法从Naktibalda的解决方案中找出我想要的东西。再说一遍,我知道如何使用子查询来做到这一点,OMG小马再次回答。

1 个答案:

答案 0 :(得分:1)

使用:

SELECT x.id,
       x.category_id,
       x.rating
  FROM YOUR_TABLE x
  JOIN (SELECT t.category_id,
               MAX(t.rating) AS max_rating
          FROM YOUR_TABLE t
      GROUP BY t.category_id) y ON y.category_id = x.category_id
                               AND y.max_rating = x.rating