我有桌子=>帖子
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
答案 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
我希望对您有帮助