开发者

Group by - Overriding default behaviour of deciding row under each group in result

开发者 https://www.devze.com 2023-01-27 11:08 出处:网络
Extending further from this question Query to find top rated article in each category - Consider the same table -

Extending further from this question Query to find top rated article in each category -

Consider the same table -

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

There is a table articles, with fields id, rating (an integer from 1-10), and category_id (an integer representing to which category it belongs). And if I have the same goal to get the top rated articles in each query (this should be the result):-

Desired Result

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

Extension of original question

But, running the following query -

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

results into the following where everything, except the id field, is as desired. I know how to do this with a subquery - as answered in the same question - Using subquery.

id  category_id     max_rating
1    1                10
3    2                7
4    3            开发者_如何学编程    6

In generic terms

Excluding the grouped column (category_id) and the evaluated columns (columns returning results of aggregate function like SUM(), MAX() etc. - in this case max_rating), the values returned in the other fields are simply the first row under every grouped result set (grouped by category_id in this case). E.g. the record with id =1 is the first one in the table under category_id 1 (id 1 and 2 under category_id 1) so it is returned.

I am just wondering is it not possible to somehow overcome this default behavior to return rows based on conditions? If mysql can perform calculation for every grouped result set (does MAX() counting etc) then why can't it return the row corresponding to the maximum rating. Is it not possible to do this in a single query without a subquery? This looks to me like a frequent requirement.

Update

I could not figure out what I want from Naktibalda's solution too. And just to mention again, I know how to do this using a subquery, as again answered by OMG Ponies.


Use:

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
0

精彩评论

暂无评论...
验证码 换一张
取 消