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

bmp9r5qi  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(324)

我有一张table

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

基本上,我只想显示每个类别中的一个最大值,即使它有多个最大值。如果有多个最大值,那么我希望它显示按内容列列排序的第一个值,即文本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
hc2pp10m

hc2pp10m1#

有多种方法可以做到这一点。如果每行都有唯一的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 作为表别名。那是个坏主意。您应该使用表名的缩写。它使查询更容易理解。

jc3wubiy

jc3wubiy2#

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

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

希望对你有帮助

相关问题