【问题标题】:SQL: Find top-rated article in each categorySQL:查找每个类别中评分最高的文章
【发布时间】:2010-11-27 21:09:02
【问题描述】:

我有一个表articles,其中包含字段idrating(1-10 的整数)和category_id(表示它属于哪个类别的整数)。

如何在一个 MySQL 查询中找到每个类别中评分最高的单篇文章?我想ORDER BYLIMIT 通常是我找到评价最高的文章的方式,但我不确定如何将其与分组混合以获得所需的结果,如果可以的话。 (依赖子查询可能是一个简单的答案,但是 ewwww。有更好的方法吗?)

对于以下数据:

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

我希望退回以下内容:

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

【问题讨论】:

    标签: sql mysql


    【解决方案1】:

    试试这些

    SELECT id, category_id, rating
    FROM   articles a1
    WHERE rating = 
    (SELECT MAX(a2.rating) FROM articles a2 WHERE a1.category_id = a2.category_id)
    

    SELECT * FROM (SELECT * FROM articles ORDER BY rating DESC) AS a1 GROUP BY a1.rating;
    

    【讨论】:

    • 看起来他们应该这样做。我想看看那些令人震惊的 SQL 向导中的一个是否可以在没有子查询的情况下完成某些事情,因为我以前遇到过那些陷入困境的问题,但是,如果没有,这应该可以解决问题 :) 谢谢!
    • @Matchu,我无法想象在单个查询中有任何方法:/
    • 好吧,我会放弃的。谢天谢地,这只是一个 cron 作业,而不是要在每个页面上运行的东西。谢谢! :)
    【解决方案2】:

    您也可以将子选择用作 FROM 子句的目标,这听起来很有趣,但查询更容易理解。

    SELECT a1.id, a1.category_id, a1.rating 
    FROM articles as a1, 
         (SELECT category_id, max(rating) AS mrating FROM articles AS a2 
          GROUP BY a2.category_id) AS a_inner 
    WHERE 
      a_inner.category_id = a1.category_id AND 
      a_inner.mrating = a1.rating;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-13
      • 2016-04-07
      • 1970-01-01
      相关资源
      最近更新 更多