sql代码显示每个类别中具有多个该类别中的最大值的最大值?

时间:2018-07-08 13:02:13

标签: php mysql sql

我有桌子=>帖子

     content || category || views
   -------------------------------
     text 1  |  cat2     | 1000
     text 2  |  cat2     | 1000
     text 3  |  cat1     | 500
     text 4  |  cat1     | 400

我想显示每个类别的最大值,但显示为:

     content || category || views
   -------------------------------
     text 1  |  cat2     | 1000
     text 2  |  cat2     | 1000
     text 3  |  cat1     | 500

我的愿望输出:

     content || category || views
   -------------------------------
     text 1  |  cat2     | 1000
     text 3  |  cat1     | 500

基本上我只希望显示每个类别中的一个最大值,即使它具有多个最大值。如果大于最大值,那么我希望它显示该值在排序中优先按内容列coln即文本1。

我运行的查询:

SELECT t1.*
FROM post t1
INNER JOIN
(
    SELECT category, MAX(views) AS max_views
    FROM post
    GROUP BY category
) t2
    ON t1.category = t2.category AND t1.views = t2.max_views order by views DESC

2 个答案:

答案 0 :(得分:2)

有多种方法可以做到这一点。如果每一行都有唯一的ID,则可以执行以下操作:

SELECT p.*
FROM post p
WHERE p.id = (SELECT p2.id
              FROM post p2
              WHERE p2.category = p.category
              ORDER BY p2.views DESC
              LIMIT 1
             );

如果有主键,最好使用主键。如果您在post(category, views)上有一个索引,上面的查询应该很快。

如果content是唯一的,则可以使用:

SELECT p.*
FROM post p
WHERE p.content = (SELECT p2.content
                   FROM post p2
                   WHERE p2.category = p.category
                   ORDER BY p2.views DESC
                   LIMIT 1
                  );

否则,多种聚合将起作用,例如:

SELECT p.category, MAX(p.content) as content, MAX(p.views) as max_views
FROM post p INNER JOIN
     (SELECT category, MAX(views) AS max_views
      FROM post
      GROUP BY category
     ) p2
    ON p.category = p2.category AND p.views = p2.max_views GROUP BY p.category;

当然,MySQL 8+通过实现ANSI标准的ROW_NUMBER()功能来解决此问题。

我注意到您的查询使用通用t作为表别名。那是个坏主意。您应该使用表名的缩写。它使查询更容易遵循。

答案 1 :(得分:0)

您可以通过在子查询中选择每个类别中观看次数最多的内容以及最大观看次数来获得

select distinct t1.category,
    (select t2.content
    from post t2
    where t2.category = t1.category
    order by t2.views
    limit 1
    ) best_content,
    max(t1.views) views
from post t1
group by t1.category

我希望对您有帮助